0

Хочу решить следующую задачу: дан текстовый файл, считать из него информацию и перезаписать ее в новый файл изменив слово "one" на 1 и слово "nine" на 9.
Пример :
file1.txt
one * nine = nine
nine / one = nine

file2.txt - результативный файл
1 * 9 = 9
9 / 1 = 9

Написал такое решение:

FILE *wfile = fopen("Temp.txt", "w"); // откроем старый файл

// запишем в него две строки
fprintf(wfile, "%s", "one * nine = nine");
fprintf(wfile, "%s", "\nnine / one = nine");

fclose(wfile); // закроем его

wfile = fopen("Result.txt", "w"); // открываем новый файл для записи
FILE *rfile = fopen("Temp.txt", "r"); // открываем старый для чтения

char tmp[100];
while (!feof(rfile)) { 
    fscanf(rfile, "%s ", &tmp); // считываем слово из старого файла

    if (!strcmp(tmp, "one")) // если это "one",
        fprintf(wfile, "%d ", 1); // то запишем в новый файл 1
    // аналогично для "nine"
    else if (!strcmp(tmp, "nine")) 
        fprintf(wfile, "%d ", 9);
    else // или же это обычное слово
        fprintf(wfile, "%s ", tmp);
}

fclose(rfile);
fclose(wfile);

Программа работает почти правильно. Но есть одна проблема.
Если в старом файле я имею такие две строки:
one * nine = nine
nine / one = nine
То в результативном получу одну:
1 * 9 = 9 9 / 1 = 9

Почему так выходит и как это исправить?
Спасибо.

  • 1
    ну так добавьте перевод строки руками – pavel Mar 27 '19 at 16:06
  • 1
    И опять это вечное while (!feof(rfile))... – Harry Mar 27 '19 at 16:23
  • @pavel, после каждого слова добавлять перенос нет смысла, т.к. это не правильно. А вот как Вы предлагаете сделать перевос именно строки? – Boris Makhlin Mar 27 '19 at 16:29
  • @Harry, а как правильно тогда? :) – Boris Makhlin Mar 27 '19 at 16:32
  • 1
    @BorisMakhlin правильно - проверять возвращаемое значение функции scanf. А вообще советую fgets использовать. Она читает ровно строку. – pavel Mar 27 '19 at 16:34
  • 1
    https://ru.stackoverflow.com/questions/833980/%d0%9f%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d0%be%d0%b5-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b8-%d0%ba%d0%be%d0%bd%d1%86%d0%b0-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0 – Harry Mar 27 '19 at 16:42
  • 1
    Форматированный ввод fscanf всегда игнорирует пробельные символы (кроме форматов %c и %[]) . Как всегда было и как и должно быть. Почему для вас это явилось сюрпризом? – AnT stands with Russia Mar 27 '19 at 16:49

0 Answers0