Ошибка чтения и записи ввода-вывода C-ФАЙЛА

#c #file #loops #character #file-pointer

#c #файл #циклы #символ #файл-указатель

Вопрос:

Я пытаюсь поменять существующие символы из файла новыми символами один за другим. Новые символы получаются путем манипулирования существующими символами путем вычитания одного из ASCII-кода. Файл с текстом уже существует, но по какой-то причине я получил бесконечный цикл. Что я делаю не так?

 #include <stdio.h>

int main()
{
  FILE *fp = fopen("myfile.txt", "r ");

  if (fp == NULL)
    printf("File cannot be opened.");
  else
  {
    // Used for retrieving a character from file
    int c;

   // Pointer will automatically be incremented by one after executing fgetc function
    while ((c = fgetc(fp)) != EOF)
    {
        // Decrement pointer by one to overwrite existing character
        fseek(fp, ftell(fp)-1, SEEK_SET);

        // Pointer should automatically increment by one after executing fputc function
        fputc(c-1, fp);

        printf("%cn", c);
    }

    fclose(fp);
 }

    return 0;
}
  

-РЕДАКТИРОВАТЬ-
Я изменил тип данных c с char на int, но проблема все еще сохранялась. Однако моя проблема была решена путем добавления fseek(fp, 0, SEEK_CUR) после вызова fputc(). Я считаю, что комментарий Джонатана Леффлера должен стать ответом, поскольку на эту проблему не было ответа на другой вопрос.

Комментарии:

1. fgetc Функция возвращает int . Для этого есть причина. Я рекомендую вам соответствующим образом изменить свою переменную c .

2. Вы должны позиционировать как при переходе от чтения к записи, так и при переходе от записи к чтению. Добавить fseek(fp, 0, SEEK_CUR) после fputc() вызова. (Почему? Так сказано в стандарте! См fopen() . Описание режимов: Однако за выводом не должен непосредственно следовать ввод без промежуточного вызова fflush функции или функции позиционирования файла ( fseek , fsetpos , или rewind ), а за вводом не должен непосредственно следовать вывод без промежуточного вызова функции позиционирования файла, если операция ввода не сталкивается с завершением-файл.

3. Упс, я забыл, что fgetc возвращает значение int. Я изменил тип данных c на int, но проблема сохранялась. Однако добавление fseek(fp, 0, SEEK_CUR) после вызова fputc() фактически решило мою проблему. Спасибо!

Ответ №1:

попробуйте это

 #include <stdio.h>

int main(void){
    FILE *fp = fopen("myfile.txt", "r ");

    if (fp == NULL) {
        printf("File cannot be opened.");
        return -1;
    }

    int c;
    long pos = ftell(fp);
    while ((c = fgetc(fp)) != EOF){
        fseek(fp, pos, SEEK_SET);//In the case of text file Do not operate the offset.
        fputc(c-1, fp);
        fflush(fp);//To save the output.
        pos = ftell(fp);

        printf("%cn", c);
    }
    fclose(fp);

    return 0;
}