fscanf无法从文本文件的开头读取

时间:2016-07-07 03:12:25

标签: c

我正在编写一个程序,从文件中读取虚拟地址(32位)整数并将它们转换为物理地址。现在我使用fscanf从文件中读取每个32位整数。由于某种原因,它不能从文本文件的开头读取。它开始从文件的中间读取。

例如,如果文件中包含以下数字

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

1 个答案:

答案 0 :(得分:3)

代码正常工作,让我相信它可能是文件有问题(a)

首先,请确保 通过暂时重命名并确保代码输出错误来读取您认为正在阅读的文件。您还应该return 1如果无法打开文件,以便不使用空指针调用fscanf,并在文件完成后fclose调用文件。

如果您在重命名文件时没有看到错误,则可能是您的代码运行在与您认为不同的目录中(某些IDE会执行此操作),并且&#39 ;那里的文件与你的期望不同。

另一种可能性是文件中的某些导致了问题。

通常通过对文件进行十六进制转储并确保所有字符都有效来检测此类问题。在Linux下,您可以这样做:

od -xcb addresses.txt | less

并且基本上寻找既不是09也不是换行符\n的任何字符。

如果事实证明文件 没问题,我会毫不犹豫地提到这一点,但可能只是因为你的终端窗口或回滚缓冲区不够大保持所有输出。

我的意思是,如果你在输入文件中有50行,而终端窗口中只有40行,那么很可能会让那些不知情的人开始在数据的中途开始。

即使假设你不是新手也不足以落入那么,一个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;
}

(a)事实上,尽管存在一些小问题,但 可以正常工作,一旦你添加了正确的标题,我认为你只是暂时没有问题。以下脚本显示了代码(标题包含后跟完全你所拥有的内容):

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