лишние пробелы написаны в режиме r + - PullRequest
0 голосов
/ 13 мая 2018

В приведенном ниже коде добавляются дополнительные пробелы (может быть около 300 пробелов), если я записываю данные после поиска файлового указателя на начальную позицию после строки

fseek(fp1,0,SEEK_SET);

Если я прокомментирую второй вызов функции fputs (), это не проблема. Кроме того, введенные данные не добавляются в конце, вместо них добавляются только пробелы. Я не могу определить проблему.

Я использую компилятор TDM-GCC-64.

Для тестирования файл file1.txt вначале содержал «Welcome to You All». Введенные данные: «Сегодня» Вывод после выполнения программы: «Todayme to You All» с последующим множеством пробелов.

int main()
{
    FILE *fp1;
    char ch;
    char data[50];
    fp1=fopen("file1.txt", "r+");
    if(fp1==NULL)
    {
        printf("Error in Opening the file\n");
        return(0);
    }

    printf("Read and Write Mode. The data in the file is\n");
    while((ch=getc(fp1))!=EOF)
    {
        putc(ch,stdout);
    }
    // Write some data at the end of the file
    printf("\nEnter some data to be written to the file\n");
    gets(data);
    fseek(fp1,0,SEEK_END);
    fputs(data,fp1);
    fseek(fp1,0,SEEK_SET);
    fputs(data,fp1);
    printf("data in file after write operation is\n");
    while((ch=getc(fp1))!=EOF)
    {
        putc(ch,stdout);
    }
    fclose(fp1);
    return 0;
}

1 Ответ

0 голосов
/ 13 мая 2018

Вы должны проверить мелкий шрифт в документации fopen:

В режиме обновления ('+') могут выполняться как ввод, так и вывод, но за выводом не может следовать ввод без промежуточного вызова fflush, fseek, fsetpos или rewind, а за вводом не может следовать вывод без промежуточного вызовите fseek, fsetpos или rewind, если операция ввода не встретила конец файла.

Чтение и запись могут быть буферизованы, но все же использовать одну позицию файла. Переключение режимов без предупреждения о времени выполнения (fseek) может испортить буферизацию. Как вы заметили!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...