【问题标题】:Reading from binary file is unsuccessful in C在 C 中从二进制文件读取不成功
【发布时间】:2013-07-09 20:51:23
【问题描述】:

我正在使用 C 编程语言并试图读取二进制文件中每一行的第一个字符串。

二进制文件中的数据示例(我已经写入了一个txt文件以便向您展示)

伊利亚伊利亚瓦茨曼 16.00 以色列 1 0 1

我想读给该行中的第一个 Iliya(或者该行中的第一个单词是什么)。

我正在尝试以下代码,但它不断将 NULL 返回给我给他的字符串变量

以下代码:

FILE* ptrMyFile;
    char usernameRecieved[31];
    boolean isExist = FALSE;
    ptrMyFile = fopen(USERS_CRED_FILENAME, "a+b");
    if (ptrMyFile)
    {
        while (!feof(ptrMyFile) && !isExist)
        {
            fread(usernameRecieved, 1, 1, ptrMyFile);
            if (!strcmp(userName, usernameRecieved))
            {
                isExist = TRUE;
            }
        }
    }
    else
    {
        printf("An error has encountered, Please try again\n");
    }
    return isExist;

我对布尔变量使用 typedef 和 #define (0 为假,其他一切为真(TRUE 为真,FALSE 为假))

usernameRecieved 不断从 fread 获取 NULL。

我应该怎么做才能解决这个问题?

【问题讨论】:

  • 你知道你只读取 fread() 中的一个字节吗?
  • 二进制文件的格式是什么?您不能只使用 freed() 从二进制文件中读取 C 字符串,除非它 \0 终止并且您知道确切的位置和长度。 userName 未定义。
  • 您的文件读取逻辑错误。 feof() 函数仅在您已尝试读取文件末尾 时返回非零值。这意味着在您成功读取文件中的最后一条记录后,feof() 返回 false,然后您执行另一个 fread() 并继续使用结果。 fread() 的返回值是已读取的对象数,因此正确的程序是始终测试fread() 的返回值,如果该值为零或其他“错误”,则 你检查feof() 并决定是否退出循环。 (另见ferror()。)
  • 对此感到好奇,您正在打开文件进行读写(二进制模式),初始位置是EOF

标签: c project


【解决方案1】:

而不是这个:

fread(usernameRecieved, 1, 1, ptrMyFile);

试试这个:

memset(usernameRecieved, 0, sizeof(usernameRecieved));
fread(usernameRecieved, sizeof(usernameRecieved)-1, 1, ptrMyFile);

事实上,您最多只能从文件中读取一个字节。

【讨论】:

【解决方案2】:

Documentation on fread

有几件事:您将 fread 中的计数字段设置为 1,因此您最多只能读取 1 个字节(假设您没有碰到 EOF 或其他终端标记)。 您想要的可能是:

fread(usernameRecieved, 1, 31, ptrMyFile);

这样您将复制到整个字符缓冲区中。然后,您将只想比较您使用的任何分隔符(空格、句点等)。

尚不清楚“usernameRecieved 不断变为 NULL”是什么意思; usernameRecieved 在堆栈上(您没有使用 malloc)。你的意思是什么都没有被读取?我强烈建议您始终检查 fread 的返回值以查看读取了多少;这有助于调试。

【讨论】:

  • 这不是空的,那是一大堆'M's...你的输入文件有一堆Ms/它是否格式正确并且存在?
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2011-05-08
  • 1970-01-01
  • 2017-10-01
  • 2011-09-03
  • 2016-01-15
相关资源
最近更新 更多