我正在编写一个必须遍历二进制文件并将其写入文本文件的函数。二进制文件的每一行都包含
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;
}
答案 0 :(得分:3)
您想要读取二进制数据,但是,您的文件是为读取文本("r"
)而不是读取二进制文件而开放的("rb"
)。因此,fread()
可能会将"\r\n"
转换为"\n"
,这可能会在特定unsigned int
或float
值的基础表示包含{{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");
打开任何二进制文件。