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()仍然是我应该使用的函数。有人帮我打环吗?我对那一部分很迷茫。谢谢你你试过什么?你应该就此提出一个问题,注意任何不当行为或错误信息,并询问你对什么感到困惑。。。