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

时间:2017-02-12 03:00:23

标签: c text io binary

我正在编写一个必须遍历二进制文件并将其写入文本文件的函数。二进制文件的每一行都包含
l1 firstname l2 lastname ID GPA
例)Mary Joeseph 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;

}

2 个答案:

答案 0 :(得分:3)

您想要读取二进制数据,但是,您的文件是为读取文本"r")而不是读取二进制文件而开放的("rb" )。因此,fread()可能会将"\r\n"转换为"\n",这可能会在特定unsigned intfloat值的基础表示包含{{1}时导致问题}序列。

改变这个:

"\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);

答案 1 :(得分:0)

const mergeArrays = (arr1, arr2) => { if (arr2.length > arr1.length) [arr1,arr2] = [arr2, arr1] //swap: larger first return arr1.map( (item, idx) => Object.assign({}, item, arr2[idx]) ) } mergeArrays( [{id:1},{id:2}], [{age: 20}, {age: 25}, {age: 22}] ) //[ { age: 20, id: 1 }, { age: 25, id: 2 }, { age: 22 } ] mergeArrays( [{age: 20}, {age: 25}, {age: 22}], [{id:1},{id:2}] ) //[ { age: 20, id: 1 }, { age: 25, id: 2 }, { age: 22 } ]

这应该是

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