Некорректная работа программы по работе с файлами - добавляется лишний символ - 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)), то цикл прерывается.
- В данном случае в вопросе не представлен весь код, поэтому невозможно точно сказать, что происходит после этого. Но обычно в таких случаях происходит обработка полученного символа или его запись в файл.