Некорректная работа программы по работе с файлами - добавляется лишний символ - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Есть вот такая вот программа. Она работает корректно, за исключением одного но: в конце она добавляет символ 'я'. Путем переделки цикла 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);
}
Переделанный цикл 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 ((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;
....

Объяснение кода листинга программы

  1. В коде представлен бесконечный цикл while(true), который выполняется до тех пор, пока не будет достигнут конец файла (feof(f)).
  2. В каждой итерации цикла считывается один символ из файла с помощью функции getc(f) и сохраняется в переменную c.
  3. Если достигнут конец файла (feof(f)), то цикл прерывается.
  4. В данном случае в вопросе не представлен весь код, поэтому невозможно точно сказать, что происходит после этого. Но обычно в таких случаях происходит обработка полученного символа или его запись в файл.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы