Этот код должен работать нормально, как есть, что приводит меня к мысли, что, может быть, это файл по вопросу (а).
Для начала убедитесь, что вы : чтение файла, который, по вашему мнению, вы читаете, временно переименовав его и убеждаясь, что ваш код выдает сообщение об ошибке. Вы также должны указать return 1
, если файл не открывается, чтобы не вызвать fscanf
с нулевым указателем и fclose
файл после того, как вы закончите с ним.
Если вы не видите ошибку при переименовании файла, возможно, ваш код работает в другом каталоге, чем вы думаете (некоторые IDE это делают), и там есть файл, который отличается от того, что вы ожидаете.
Другая возможность заключается в том, что есть в пределах файла, вызывающего проблему.
Эта проблема обычно обнаруживается путем выполнения шестнадцатеричного дампа файла и обеспечения правильности всех символов. Под Linux, вы могли бы сделать:
od -xcb addresses.txt | less
и в основном искать любой символ, который не является ни 0
через 9
, ни новой строки \n
.
Если выясняется, файл является в порядке, я стесняюсь говорить об этом, но это может быть просто потому, что ваше окно терминала или скроллинг буфер не является достаточно большим, чтобы вместить все выходные.
Под этим я имею в виду, если у вас есть пятьдесят строк во входном файле и только сорок строк в окне терминала, он вполне может взглянуть на непосвященную, что он начинается частично через данные.
Даже если вы не новичок достаточно, чтобы упасть на , то буфер с прокруткой на 1000 строк с 1010 линиями вывода может иметь такой же эффект.
Лучший способ проверить это - передать вывод вашей программы через less
, чтобы он показывал вам страницу за раз или перенаправлял ее в файл, который вы можете просмотреть в редакторе.
Для чего это стоит, это то, как я бы написал код, минималистский подход, который до сих пор работает правильно при отсутствии входного файла и который явно очищает все ресурсы перед выходом:
#include <stdio.h>
int main(void) {
unsigned int LogicalAdd;
FILE *fp = fopen ("addresses.txt", "r");
if (fp == NULL) {
printf("Error: couldn't open file");
return 1;
}
while (fscanf(fp, "%d\n", &LogicalAdd) == 1){
printf ("%u\n", LogicalAdd);
}
fclose (fp);
return 0;
}
(а) на самом деле, несмотря на незначительные проблемы, это делает работу, как только вы добавить правильные заголовки, которые я предполагаю, что вы только что вышли из вопроса. Следующая запись показывает, как (включение заголовка следует точно, что вы имели) кода:
pax> cat testprog.c
#include <stdio.h>
int main(int argc, char *argv[]){
char FileName[100];
unsigned int LogicalAdd;
FILE *fp; // file pointer
unsigned int Offset;
int AmountRead = 0;
int FirstTime =0;
fp = fopen("addresses.txt", "r");
if(fp == NULL){
printf("Error: couldn't open file");
}
while((fscanf(fp, "%d\n", &LogicalAdd)) == 1){
printf("%d\n", LogicalAdd);
}
}
и выход при компиляции и запуска:
pax> gcc -o testprog testprog.c ; ./testprog
16916
62493
30198
53683
40185
28781
24462
48399
64815
18295
12218
22760
57982
27966
54894
38929
Я не вижу, что код, проявляющий вы описываете. Это ваш настоящий код? Если да, то какова цель «Offset», «AmountRead» и «FirstTime», которые не используются. Что говорит отладчик, когда вы проходите через код? –
Вы можете проверить с помощью функции fgetc (char), чтобы проверить, откуда она начинается чтение. Сделайте это 2-3 раза, чтобы узнать, откуда он начинается. –
Off topic: вам нужно сделать что-то большее, чем просто вызывать ошибку messge, если fopen терпит неудачу. В частности, вы не должны продолжать 'fscanf', используя' fp', если 'fopen' терпит неудачу. – sps