C 如何使用fread()读取二进制文件

C 如何使用fread()读取二进制文件,c,text,io,binary,C,Text,Io,Binary,我正在编写一个函数,它必须遍历一个二进制文件并将其写入一个文本文件。二进制文件的每一行都包含 l1姓氏l2姓氏ID GPA ex)玛丽·乔瑟夫1234.0 其中l1和l2分别为名字和姓氏的长度,ID为无符号整数,GPA为浮点(每4个字节)。 如何正确实现循环以遍历二进制文件,直到它达到EOF?目前,生成的文本文件大部分都是乱七八糟的,我如何修复它?感谢您的帮助 int binaryToText() //add parameters { unsigned char firstName[255];

我正在编写一个函数,它必须遍历一个二进制文件并将其写入一个文本文件。二进制文件的每一行都包含
l1姓氏l2姓氏ID GPA
ex)玛丽·乔瑟夫1234.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;

}

您想读取二进制数据,但是,您的文件是打开的,用于读取文本(
“r”
),而不是读取二进制(
“rb”
)。因此,
fread()
可能正在将
“\r\n”
转换为
“\n”
,当特定
无符号int
浮点
值的基础表示包含
“\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);

您想要读取二进制数据,但是,您的文件是为读取文本而打开的(
“r”
),而不是读取二进制数据(
“rb”
)。因此,
fread()
可能正在将
“\r\n”
转换为
“\n”
,当特定
无符号int
浮点
值的基础表示包含
“\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);

FILE*binfile=fopen(“b2.bin”、“r”)

这应该是


FILE*binfile=fopen(“b2.bin”、“rb”)

打开任何二进制文件。

FILE*binfile=fopen(“b2.bin”,“r”)

这应该是


FILE*binfile=fopen(“b2.bin”、“rb”)

打开任何二进制文件。

在提出此类问题之前,请至少进行谷歌搜索。你能发布一条实际的行吗?如果它是一个二进制文件,那么l1、l2、ID和GPA可能正好是4个字节,而不是ASCII“4.0”的3个字节。每个字段和每行末尾的CR或LF或CRLF之间是否有空格?如果您使用的是用
fwrite(firstName,strlen(firstName),1,binfile)编写的文件;fwrite(lastName,strlen(lastName),1,binfile)
在上一篇文章中,此代码很难知道一个名称的结束位置和另一个名称的开始位置。需要重新规划该文件的输出。我预计本周末还会有第三篇来自@OP的帖子。例如,一个二进制文件可能有一条类似“\0\0\x04Mary\0\0\0\x06Joseph\0\0\x04\xd2\x40\x80\0\0”的记录。它甚至可能有固定大小的名字和姓氏区域。我如何打开二进制文件并复制一行?在记事本中,它是一堆胡言乱语和符号。对不起,我是个新手。在问这样的问题之前,请至少在谷歌上搜索一下。你能发一条实际的帖子吗?如果它是一个二进制文件,那么l1、l2、ID和GPA可能正好是4个字节,而不是ASCII“4.0”的3个字节。每个字段和每行末尾的CR或LF或CRLF之间是否有空格?如果您使用的是用
fwrite(firstName,strlen(firstName),1,binfile)编写的文件;fwrite(lastName,strlen(lastName),1,binfile)
在上一篇文章中,此代码很难知道一个名称的结束位置和另一个名称的开始位置。需要重新规划该文件的输出。我预计本周末还会有第三篇来自@OP的帖子。例如,一个二进制文件可能有一条类似“\0\0\x04Mary\0\0\0\x06Joseph\0\0\x04\xd2\x40\x80\0\0”的记录。它甚至可能有固定大小的名字和姓氏区域。我如何打开二进制文件并复制一行?在记事本中,它是一堆胡言乱语和符号。对不起,我是个新手。你说的“rb”是对的,我自己也没听清楚。但是,数据是二进制的,我给出的示例在技术上是它应该在文本文件中转换成的,所以我认为fread()仍然是我应该使用的函数。有人帮我打环吗?我对那一部分很迷茫。谢谢你你试过什么?你应该就此提出一个问题,注意任何不当行为或错误信息,并询问你对什么感到困惑……你对“rb”的看法是正确的,我自己也没有注意到。但是,数据是二进制的,我给出的示例在技术上是它应该在文本文件中转换成的,所以我认为fread()仍然是我应该使用的函数。有人帮我打环吗?我对那一部分很迷茫。谢谢你你试过什么?你应该就此提出一个问题,注意任何不当行为或错误信息,并询问你对什么感到困惑。。。