Когда fgets перестает читать строку?

Я отлаживаю свою программу с помощью gdb, fgets (line, sizeof (line), fp2) ничего не читает из текстового файла. поэтому программа зацикливается на бесконечности на стороне while(!feof(fp2)), и EOF никогда не встречается, я не знаю, почему?

Я помещаю часть кода для контекста,

вот входной файл:

  COPY   START  1000
  FIRST  STL    RETADR
  CLOOP  JSUB   RDREC
         LDA    LENGTH
         COMP   ZERO
         JEQ    ENDFIL
  ZERO   WORD   0
  RETADR RESW   1
  LENGTH RESW   1
  BUFFER RESB   4096



         RSUB
         END    FIRST

вот основная программа:

int main(int argc, char *argv[])
{

    FILE *fp, *fp2, *fphex;
    char line[1000] = "" ;


    if (argc != 2)
    {
        printf("Usage: %s filename\n", argv[0]);
        exit(EXIT_FAILURE);
    }


    if ((fp = fopen(argv[1], "r")) == NULL)
    {
        printf("Can't open %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }

    fp2 = fopen("intermediate.asm", "w");
    fp2 = removecomment(fp,fp2);
    rewind(fp2);

    while (!feof(fp2))
    {
        fgets(line, sizeof(line), fp2);   /*this fgets reads only 4 bytes of empty spaces*/ 
        parse(line);

    }
    struct node *print = head;
    fphex = fopen("Hex_code", "w");

    while(print == NULL)
    {
        fprintf(fphex, "%s", print->instruction);
        print = print->next;
    }

    return(0);
}

Обновлено:

Хотя (! Feof (указатель файла *) не было проблемой.

Я пытался читать из файла fopen только для записи.

Я решил это с помощью fclose(file) fopen("file","r") или как предлагают другие режим w +. Я считаю, что закрытие и открытие в режиме чтения безопаснее.

Возьмите тур, прочтите Как спросить и минимальный воспроизводимый пример. Можете ли вы сократить этот код до наименьшего примера, демонстрирующего проблему?

jwdonahue 29.03.2018 05:03

Что на самом деле находится в line[i] в момент оценки условия?

jwdonahue 29.03.2018 05:09

Вы, кажется, не понимаете, что такое MCVE. Вы только что удалили весь соответствующий код. Вас просили исключить все, что не имеет отношения к делу, до тех пор, пока у вас не будет рабочего примера, демонстрирующего проблему без всего этого лишнего кода. Обычно это помогает найти проблему самостоятельно.

jwdonahue 29.03.2018 05:16

@jwdonahue читает символ за символом из fgets (line, sizeof (line), fp2), чтобы пропускать пробелы и табуляции и читать только инструкции или операнды. i удалил остальную часть кода, это слишком расплывчато. проблема во внутреннем цикле feof.

topcat 29.03.2018 05:16

Глядя на это сейчас ...

jwdonahue 29.03.2018 05:17

Нам все еще нужно содержимое входного файла (ов).

jwdonahue 29.03.2018 05:18

См. stackoverflow.com/questions/5431941/….

jwdonahue 29.03.2018 05:23

@jwdonahue Я добавил это, я удалил остальную часть программы, потому что это казалось ненужным.

topcat 29.03.2018 05:23

Возможный дубликат Почему «while (! Feof (file))» всегда неверно?

jwdonahue 29.03.2018 05:24

Вы вызываете fgets и feof в потоке вывода, чего вы ожидали?

M.M 29.03.2018 05:25

Да, я отслеживал это с помощью оригинального сообщения, затем весь код изменился у меня на глазах. Я думаю, что у OP их гудзинты пересекаются с их кумзутами. Но в то время как (! Feof ()) в любом случае ошибочен.

jwdonahue 29.03.2018 05:26

@jwdonahue хорошо, тогда что мне делать вместо feof, что произойдет, когда он прочитает файл?

topcat 29.03.2018 05:43

Вам следует прочитать вопросы и ответы, на которые я ссылался ранее. Вы уже пытались исправить путаницу с входами и выходами?

jwdonahue 29.03.2018 05:48

@topcat нельзя читать из файла, открытого в режиме "w"

M.M 29.03.2018 05:50

Избегайте чтения за пределами конца INPUT файла, если вызов fgets() находится внутри условия while().

user3629249 29.03.2018 06:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
15
603
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я считаю, что это хорошо решено здесь, это решит, если вы замените while(!feof(fp2)) ---> while(!feof(fp2) && !ferror(fp2))

fp2 был открыт в режиме записи «w», поэтому он должен быть закрыт, а затем открыт в режиме чтения «r», чтобы строки могли быть прочитаны должным образом, люди могли заметить это вместо того, чтобы сказать «Пока» (! feof (fp2)).

Ответ принят как подходящий

Хорошо, вот в чем проблема, у вас есть "w" в качестве режима открытия файла.

fp2 = fopen("intermediate.asm", "w");

так должно быть

fp2 = fopen("intermediate.asm", "r");

режимы открытия файлов

  1. w - запись (файл удаляется, если существует)
  2. r - читать (файл должен существовать)
  3. а - добавить

чем у вас есть знак +, который означает:

  1. w + - запись и чтение (перезапись, если файл существует)
  2. r + - чтение и запись (файл должен существовать)
  3. a + - добавить и прочитать (создать файл, если он не существует)

Другие вопросы по теме