C/C++

Помощь НОВИЧКУ в поиске недочетов в коде (Язык - С)

Есть задание: *чтобы было понятно что я делаю вообще*
Дан текстовый файл. Заменить в нем все подряд идущие пробелы на один пробел.
Есть код *с горем пополам склеенный ламмером*
Есть ошибки (не работает). Незнаю как исправить.

Гуры великие, помогите.
 #include 

#include

#include

#include

#include

#include

#include

#include

#define PROBEL ' '

#define _CRT_SECURE_NO_WARNINGS



using namespace std;



int Finder(char x[])

{

char str[255];

char sym;

int flag = 0;

int ptr = 0;



setlocale(LC_ALL, "Rus");

printf("Введите текст:\n");

while ((sym = getchar()) != '\n')

{

if ((sym == PROBEL) && (!flag))

{

flag = 1; // set bit

str[ptr++] = sym; // save 1 probel

}

else

{

if ((flag) && (sym != PROBEL))

{

flag = 0;

}

}

if (sym != PROBEL)

str[ptr++] = sym;

}

str[ptr++] = '\0';



printf("Результат:\n %s\n", str);



return 0;



}





void main()

{

char x[255];

int k, * p;

FILE* f;



SetConsoleCP(1251); // Кириллица в консоли

SetConsoleOutputCP(1251); // ПКМ по окну > свойсва > сменить шрифт



setlocale(LC_ALL, "rus");

printf("Добро пожаловать в систему исправлений!\n");

printf("Пожалуйста, выберите нужный Вам раздел:\n'любая цифра' - для исправления ошибок в файле,\n'0' - для исправления ошибок вручным вводом:\n");

scanf_s("%d", &k);

if (k == 0)

{

gets_s(x);

Finder(x);

}

else

{

string Agent = "MyFile.txt";

ofstream fout;



fout.open(Agent);

if (!fout.is_open())

{

printf("Ошибка открытия файла! \n");

getchar();

}

else

{

printf("Файл обрабатывается...\n");

while (fgets(x, 100, f) && *x != '\n') {

for (p = strchr(x, ' '); p; p = strchr(p + 1, ' '))

while (*(p + 1) == ' ')

memmove(p + 1, p + 2, strlen(p + 1));

fprintf(stdout, "%s", x);

fprintf(f, "%s", x);

printf("Обработка файла завершена успешно! \n");

}

fout.close();

}

}

}
Matvey Matvey
Matvey Matvey
247
В языке C не существует fstream, string, using namespace и т.д.
Достаточно хранить только текущий и предыдущий символы входного файла. И если хотя бы один из них не равен пробелу, выводить текущий символ в выходной файл.

FILE *inp, *out;
int cur, prev = '\0'; // именно int, а не char - это грабли для всех новичков C
inp = fopen("имя_входного_файла", "r");
out = fopen("имя_выходного_файла", "w");
for (; (cur = getc(inp)) != EOF; prev = cur) {
if (prev != ' ' || cur != ' ') { putc(cur, out); }
}
fclose(inp);
fclose(out);
Ма
Максим
52 928
Лучший ответ
Matvey Matvey Спасибо за помощь! Учту, когда буду переделывать :)
#include <iostream>
using namespace std;

void del_z()
{
char ch;
while ((ch = cin.get()) != EOF)
{
if (ch != ' ') cout << ch; else
{
cout << ch;
while (((ch = cin.get()) != EOF) && ch == ' ');
if (ch != EOF) cout << ch;
}
}
}

int main()
{
FILE* inp,* outp;
cout << "Enter input resourse\n0 - file, 1 - keyboard\n";
bool inp_type; cin >> inp_type;
cout << "Enter output resourse\n0 - file, 1 - console\n";
bool out_type; cin >> out_type;
if (!inp_type) cout << "TIP: Use CTRL+Z for breake input\n";
if (!inp_type && !freopen_s(&inp,"N:/text.txt", "r", stdin)) cout << "Input stream change to file\n";
else if (!inp_type) cout << "Can't redirect input stream to file\n";
if ((!out_type && !freopen_s(&outp,"N:/output.txt", "w", stdout)) ^ !out_type) cout << "Coud't redirect output to file\n";
del_z();
cout << endl;
system("Pause");
}

На С++;
Дима Мамкев
Дима Мамкев
51 416
Надо изменить расширение файла. Надо сделать чтобы стало .cpp
Ты определись - ты на си пишешь или на С++. А ты путаешься и в результате не запустится ни на одном из языков. Как понимаю, ты запускаешь в visual studio, а там только С++. Если пишешь для себя - переходи тогда на плюсы, если нет. Я бы советовал найти среду разработки попроще, чтобы не путаться. Dev C++ например - она конечно устарела, но для твоих целей подойдёт или code blocks.

Рабочий код тебе дал Андрей.

Теперь по твоему коду
Проблема №1 - ты не считываешь файл. Ты создал указать на файл, но файл ты не открыл.
Проблема №2 - for (p = strchr(x, ' '); p; p = strchr(p + 1, ' ')) тут чушь написал. Разберись, как работают указатели и вообще в типах. p = у тебя int*, а strchr возвращает char* и у тебя p преобразуется к char* и из-за этого, у тебя ошибка выскакивает.
Проблема №3 - в функции finder ты зачем-то опять начинаешь считывать, хотя ты должен работать со строкой только, которую подал на вход. начнём с того, что это логику усложняет, а во вторых, ты не сможешь работать со строкой.

Проблем скорее всего больше, но это то что я увидел.

Но ты молодец, что начал и пытаешься хоть что-то делать. Большинство тут тупо скидывают задание и ждут, пока его решат, а ты сам пытаешься.
BK
Baha Kasimov
28 652
Matvey Matvey Соглашусь с первой (и главной) проблемой моей, что меня мешкает между С и С++. Изначально неправильно расставил приоритеты в изучений, просмотром литературы, а так же просмотром различных ютуб-деятели, которые показывают такие мастерства при написаний кода (они молодцы, но мне бы хорошенько бы сначала основу зарубить) :-)

С проблемой №1 уже понял и исправил, а со второй ещё помучаюсь.

С проблемой №3 не соглашусь. В коде (и по условием задачи) предусмотрен вариант того, что я могу брать не только с файла, но и вводить данные вручную в консоль (для этого изначально при запуске программы человек выберает: либо он считывает с файла или сам вводит все вручную). Как раз Finder - для случая, если надо проверить ручной ввод (Вообще, там можно всё упростить, но для меня, как чайника...
.
Matvey Matvey ...сначала бы с этим разобраться :) ).

Спасибо за помощь! Учту, когда буду переделывать :)