2016-07-07 6 views
0

Я пишу программу, которая считывает целые числа виртуальных адресов (32 бит) из файла и преобразует их в физический адрес. прямо сейчас я использую fscanf для чтения каждого 32-разрядного целого из файла. По какой-то причине он не читает с начала текстового файла. его начало начинается с середины файла.fscanf не читает с начала текстового файла

например, если у вас есть следующие номера в файле

16916 
62493 
30198 
53683 
40185 
28781 
24462 
48399 
64815 
18295 
12218 
22760 
57982 
27966 
54894 
38929 

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

Мой код, пожалуйста, помогите.

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); 
    }  
}  
+2

Я не вижу, что код, проявляющий вы описываете. Это ваш настоящий код? Если да, то какова цель «Offset», «AmountRead» и «FirstTime», которые не используются. Что говорит отладчик, когда вы проходите через код? –

+0

Вы можете проверить с помощью функции fgetc (char), чтобы проверить, откуда она начинается чтение. Сделайте это 2-3 раза, чтобы узнать, откуда он начинается. –

+2

Off topic: вам нужно сделать что-то большее, чем просто вызывать ошибку messge, если fopen терпит неудачу. В частности, вы не должны продолжать 'fscanf', используя' fp', если 'fopen' терпит неудачу. – sps

ответ

3

Этот код должен работать нормально, как есть, что приводит меня к мысли, что, может быть, это файл по вопросу (а).

Для начала убедитесь, что вы : чтение файла, который, по вашему мнению, вы читаете, временно переименовав его и убеждаясь, что ваш код выдает сообщение об ошибке. Вы также должны указать 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 
+0

Hi Paxdiablo, он отлично работает. Он читается из правильного файла. Я получил ошибку, когда я набрал другое имя для файла. –

+1

@Charles, это было не то, что я предложил, и не обнаружил проблему, которую я поставил.Вы должны использовать одно и то же имя файла в коде и переименовать файл, который вы пытаетесь использовать. – paxdiablo

+0

Привет, Paxdiablo, я сделал это, и это нормально –

Смежные вопросы