fscanf未从文本文件开头读取

fscanf未从文本文件开头读取,c,C,我正在编写一个程序,从文件中读取虚拟地址(32位)整数,并将其转换为物理地址。现在我正在使用fscanf从文件中读取每个32位整数。由于某些原因,它不能从文本文件的开头读取。它从文件的中间开始读取 e、 g如果您在文件中有以下数字 16916 62493 30198 53683 40185 28781 24462 48399 64815 18295 12218 22760 57982 27966 54894 38929 从18295年开始。直觉上,我认为使用fseek将指针设置在顶部可以解决这

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

e、 g如果您在文件中有以下数字

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);
    }       
}    
这段代码应该可以正常工作,这让我相信可能是有问题的文件(a)

首先,通过临时重命名文件并确保代码输出错误,确保正在读取您认为正在读取的文件。如果无法打开文件以避免使用空指针调用
fscanf
,则还应
返回1
,并且
fclose
一旦处理完文件

如果重命名文件时没有看到错误,则可能是代码运行在与您想象的不同的目录中(某些IDE会这样做),并且其中有一个文件与您期望的不同

另一种可能性是,文件中存在导致问题的内容

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

od -xcb addresses.txt | less
并基本上查找既不是
0
9
也不是换行符
\n
的任何字符

如果文件没有问题,我不太愿意提及这一点,但这可能只是因为终端窗口或回滚缓冲区不够大,无法容纳所有输出

我的意思是,如果您在输入文件中有50行,而在终端窗口中只有40行,那么对于未初始化的人来说,它很可能是在数据的中间开始的

即使假设您还不是新手,不会爱上它,一个包含1010行输出的1000行回滚缓冲区也可能有同样的效果

检查这一点的最佳方法是通过管道将程序输出通过
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)

首先,通过临时重命名文件并确保代码输出错误,确保正在读取您认为正在读取的文件。如果无法打开文件以避免使用空指针调用
fscanf
,则还应
返回1
,并且
fclose
一旦处理完文件

如果重命名文件时没有看到错误,则可能是代码运行在与您想象的不同的目录中(某些IDE会这样做),并且其中有一个文件与您期望的不同

另一种可能性是,文件中存在导致问题的内容

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

od -xcb addresses.txt | less
并基本上查找既不是
0
9
也不是换行符
\n
的任何字符

如果文件没有问题,我不太愿意提及这一点,但这可能只是因为终端窗口或回滚缓冲区不够大,无法容纳所有输出

我的意思是,如果您在输入文件中有50行,而在终端窗口中只有40行,那么对于未初始化的人来说,它很可能是在数据的中间开始的

即使假设您还不是新手,不会爱上它,一个包含1010行输出的1000行回滚缓冲区也可能有同样的效果

检查这一点的最佳方法是通过管道将程序输出通过
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;
}

我没有看到你描述的代码,这是你真正的代码吗?如果是,未使用的
Offset
AmountRead
FirstTime
的用途是什么。当您单步执行代码时,调试器会告诉您什么?您可以使用fgetc(char)函数进行检查,以检查从何处开始读取。做2-3次,这样你就可以知道从哪里开始。离题:如果fopen失败,你需要做的不仅仅是打印错误消息。特别是,如果
fopen
失败,则不应继续使用
fp
执行
fscanf
。这不是调试服务。请参阅。@Charles.N您刚才发布的链接指向文本文件的
html
格式副本。如果原始文件本身有任何问题(隐藏字符、行尾等),那么在翻译过程中就会丢失。此外,您还没有回答@paxdiblo的评论,因此任何人对您进行调试的动机现在必须非常低。我不认为代码显示出您描述的问题。这是您真正的代码吗?如果是,未使用的
Offset
AmountRead
FirstTime
的用途是什么。当您单步执行代码时,调试器会告诉您什么?您可以使用fgetc(char)函数进行检查,以检查从何处开始读取。做2-3次,这样你就可以知道从哪里开始。离题:你需要做的不仅仅是打印错误