【问题标题】:How to read a binary file with fread()如何使用 fread() 读取二进制文件
【发布时间】:2017-02-12 03:00:22
【问题描述】:

我正在编写一个必须遍历二进制文件并将其写入文本文件的函数。二进制文件的每一行包含
l1 名字 l2 姓氏 ID GPA
例如)玛丽约瑟夫 1234 4.0

其中 l1 和 l2 分别是名字和姓氏的长度,ID 是无符号整数,GPA 是浮点数(每个 4 字节)。
如何正确实现一个循环来遍历二进制文件,直到它到达 EOF?目前,生成的文本文件大部分都是乱码,我该如何解决?任何帮助表示赞赏。

int binaryToText() //add parameters
{

unsigned char firstName[255];
unsigned char lastName[255];
unsigned int id;
float gpa;
char nLine[]= "\n";
char space[]= " ";


FILE * binfile = fopen("b2.bin", "r"); //Open and read binary file binfile
FILE * textfile = fopen("b2totxt.txt", "w");//Open and write to text file



if(NULL == binfile) //alerts and exits if binfile is not found
{
    fprintf(stderr, "Failed to open file\n");
    fflush(stderr);
    exit(1);
}


fread(&firstName, sizeof(firstName), 1, binfile);
fread(&lastName, sizeof(lastName), 1, binfile);
fread(&id, sizeof(id), 1, binfile);
fread(&gpa, sizeof(gpa), 1, binfile);

printf("%s %s %u %f", firstName, lastName, id, gpa); //test(doesnt come out right)

fprintf(textfile, "%s %s %u %1.1f\n", firstName, lastName, id, gpa);//also flawed





fclose(textfile);
fclose(binfile); //close bin file
return 0;

}

【问题讨论】:

  • 在提出此类问题之前,请至少进行谷歌搜索。
  • 你能发布一条实际的线路吗?如果是二进制文件,大概 l1、l2、ID 和 GPA 正好是 4 个字节,而不是 3 个字节的 ASCII “4.0”。每个字段与每行末尾的 CR 或 LF 或 CRLF 之间是否有空格?
  • 如果您使用的文件是用您之前的帖子中的fwrite(firstName, strlen(firstName), 1, binfile); fwrite(lastName, strlen(lastName), 1, binfile); 编写的,那么这段代码将无法知道一个名称的结尾和另一个名称的开头。需要重新规划该文件的输出。我预计本周末@OP 还会发布第三篇文章。
  • 例如,一个二进制文件的记录可能类似于“\0\0\0\x04Mary\0\0\0\x06Joseph\0\0\x04\xd2\x40\ x80\0\0”。它甚至可能有固定大小的名字和姓氏区域。
  • 如何打开二进制文件并复制一行?在记事本中,它是一堆乱码和符号。对不起,我是个新手。

标签: c text io binary


【解决方案1】:

您想要读取二进制数据,但是,您的文件已打开以供读取文本 ("r") 而不是读取二进制 ("rb")。因此,fread() 可能会将"\r\n" 转换为"\n",当特定unsigned intfloat 值的底层表示包含"\r\n" 序列时,这可能会导致问题。

改变这个:

FILE * binfile = fopen("b2.bin", "r");

对此:

FILE * binfile = fopen("b2.bin", "rb");

"rb" 中,b 代表二进制模式。


但是,我认为这不是您的主要问题,因为您的 二进制文件 实际上并不包含 二进制表示 的数据;它包含人类可读的表示(基于您提供的示例)。您应该使用 fscanf而不是 fread 来读取该数据。

改变这个:

fread(&firstName, sizeof(firstName), 1, binfile);
fread(&lastName, sizeof(lastName), 1, binfile);
fread(&id, sizeof(id), 1, binfile);
fread(&gpa, sizeof(gpa), 1, binfile);

到这里:

int n = fscanf(binfile, "%s %s %u %f", firstName, lastName, &id, &gpa);

【讨论】:

  • 你对“rb”是正确的,我自己错过了。但是,数据是二进制的,我给出的示例在技术上是它应该在文本文件中转换的内容,所以我认为 fread() 仍然是我应该使用的函数。循环有什么帮助吗?我在这方面迷路了。谢谢
  • 你试过什么?您应该就此提出问题,注意任何不当行为或错误消息,并询问您对什么感到困惑......
【解决方案2】:

FILE * binfile = fopen("b2.bin", "r");

这应该是

FILE * binfile = fopen("b2.bin", "rb"); 打开任何二进制文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2015-08-22
    • 2020-06-09
    • 1970-01-01
    • 2012-02-29
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多