Я отлаживаю свою программу с помощью 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 +.
Я считаю, что закрытие и открытие в режиме чтения безопаснее.
Что на самом деле находится в line[i] в момент оценки условия?
Вы, кажется, не понимаете, что такое MCVE. Вы только что удалили весь соответствующий код. Вас просили исключить все, что не имеет отношения к делу, до тех пор, пока у вас не будет рабочего примера, демонстрирующего проблему без всего этого лишнего кода. Обычно это помогает найти проблему самостоятельно.
@jwdonahue читает символ за символом из fgets (line, sizeof (line), fp2), чтобы пропускать пробелы и табуляции и читать только инструкции или операнды. i удалил остальную часть кода, это слишком расплывчато. проблема во внутреннем цикле feof.
Глядя на это сейчас ...
Нам все еще нужно содержимое входного файла (ов).
См. stackoverflow.com/questions/5431941/….
@jwdonahue Я добавил это, я удалил остальную часть программы, потому что это казалось ненужным.
Возможный дубликат Почему «while (! Feof (file))» всегда неверно?
Вы вызываете fgets и feof в потоке вывода, чего вы ожидали?
Да, я отслеживал это с помощью оригинального сообщения, затем весь код изменился у меня на глазах. Я думаю, что у OP их гудзинты пересекаются с их кумзутами. Но в то время как (! Feof ()) в любом случае ошибочен.
@jwdonahue хорошо, тогда что мне делать вместо feof, что произойдет, когда он прочитает файл?
Вам следует прочитать вопросы и ответы, на которые я ссылался ранее. Вы уже пытались исправить путаницу с входами и выходами?
@topcat нельзя читать из файла, открытого в режиме "w"
Избегайте чтения за пределами конца INPUT файла, если вызов fgets() находится внутри условия while().





Я считаю, что это хорошо решено здесь, это решит, если вы замените while(!feof(fp2)) ---> while(!feof(fp2) && !ferror(fp2))
fp2 был открыт в режиме записи «w», поэтому он должен быть закрыт, а затем открыт в режиме чтения «r», чтобы строки могли быть прочитаны должным образом, люди могли заметить это вместо того, чтобы сказать «Пока» (! feof (fp2)).
Хорошо, вот в чем проблема, у вас есть "w" в качестве режима открытия файла.
fp2 = fopen("intermediate.asm", "w");
так должно быть
fp2 = fopen("intermediate.asm", "r");
режимы открытия файлов
чем у вас есть знак +, который означает:
Возьмите тур, прочтите Как спросить и минимальный воспроизводимый пример. Можете ли вы сократить этот код до наименьшего примера, демонстрирующего проблему?