Некорректная работа программы по работе с файлами - добавляется лишний символ - C (СИ)
Формулировка задачи:
Доброго времени суток. Есть вот такая вот программа. Она работает корректно, за исключением одного но: в конце она добавляет символ 'я'. Путем переделки цикла while я выяснил, что компилятор почему-то путает символ 'я' с символом конца файла. Почему?
Первый код:Переделанный цикл while:
#include <stdio.h> #include <string.h> #define N 30 int main(int argc, char *argv[]) { char c; char namein[N],nameout[N]; int t=0; FILE *f; FILE *f2; if(argc==1) { printf("Input file name?\n"); scanf("%s", namein); printf("Output file name?\n"); scanf("%s", nameout); } if(argc==2) { strcpy(namein,argv[1]); printf("Output file name?\n"); scanf("%s", nameout); } if(argc==3) { strcpy(namein,argv[1]); strcpy(nameout,argv[2]); } if((f=fopen(namein,"r"))== NULL) { printf("Error \n"); return 1; } if((f2=fopen(nameout,"w")) == NULL) { printf("Error \n"); return 1; } while (!feof(f)) { c=getc(f); if (c!='.') { if(c!='\n') fputc(c,f2); else fputc(' ',f2); } else if(t!=1) { fputc(c,f2); t++; } else { fputc(c,f2); fputc('\n',f2); t=0; } } fclose(f); fclose(f2); }
#include <stdio.h> #include <string.h> #define N 30 int main(int argc, char *argv[]) { char c; char namein[N],nameout[N]; int t=0; FILE *f; FILE *f2; if(argc==1) { printf("Input file name?\n"); scanf("%s", namein); printf("Output file name?\n"); scanf("%s", nameout); } if(argc==2) { strcpy(namein,argv[1]); printf("Output file name?\n"); scanf("%s", nameout); } if(argc==3) { strcpy(namein,argv[1]); strcpy(nameout,argv[2]); } if((f=fopen(namein,"r"))== NULL) { printf("Error \n"); return 1; } if((f2=fopen(nameout,"w")) == NULL) { printf("Error \n"); return 1; } while ((c=getc(f))!=EOF) { if (c!='.') { if(c!='\n') fputc(c,f2); else fputc(' ',f2); } else if(t!=1) { fputc(c,f2); t++; } else { fputc(c,f2); fputc('\n',f2); t=0; } } fclose(f); fclose(f2); }
Решение задачи: «Некорректная работа программы по работе с файлами - добавляется лишний символ»
textual
Листинг программы
while(true) { c=getc(f); if(feof(f)) break; ....
Объяснение кода листинга программы
- В коде представлен бесконечный цикл while(true), который выполняется до тех пор, пока не будет достигнут конец файла (feof(f)).
- В каждой итерации цикла считывается один символ из файла с помощью функции getc(f) и сохраняется в переменную c.
- Если достигнут конец файла (feof(f)), то цикл прерывается.
- В данном случае в вопросе не представлен весь код, поэтому невозможно точно сказать, что происходит после этого. Но обычно в таких случаях происходит обработка полученного символа или его запись в файл.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д