编写一个程序,从文本文件中读取数据并将其输出到二进制文件。我很确定我正在正确读取文件,因为当我打印信息时它确实正确。但是,写入二进制文件是不正确的。文本文件的每一行都显示为:
firstname lastname id gpa
如果名字和姓氏是最多255个字符的字符串,则id是无符号4字节整数,gpa是4字节浮点数。我让它从文件中读取并打印正确的信息,但输出文件有问题。对于只有61个字节的文本文件,它几乎是1.5 KB。我的代码出了什么问题?
#include <stdio.h>
#include <stdlib.h>
int textToBinary()
{
FILE * textfile = fopen("t2.txt", "r"); //Open and read text file
FILE * binfile = fopen("t2tobin.bin", "wb"); //Open writable bin file
unsigned char firstName[256];
unsigned char lastName[256];
unsigned int id;
float gpa;
char nLine[]= "\n";
char space[]= " ";
if(NULL == textfile) //alerts and exits if binfile is not found
{
fprintf(stderr, "Failed to open file\n");
fflush(stderr);
exit(1);
}
//implement a loop to continue until the end of the file
while(fscanf(textfile, "%s %s %d %f", firstName, lastName, &id, &gpa)!= EOF){
//read one line of the text file
printf("%s %s %d %.1f\n", firstName, lastName, id, gpa); //print line information ((test))
//Writing information to binary file
fwrite(firstName, sizeof(firstName), 1, binfile);//first name
fwrite(space, sizeof(space), 1, binfile);//space
fwrite(lastName, sizeof(lastName), 1, binfile);//last name
fwrite(space, sizeof(space), 1, binfile);//space
fwrite(&id, sizeof(unsigned int), 1, binfile);//ID
fwrite(space, sizeof(space), 1, binfile);//space
fwrite(&gpa, 4, 1, binfile);//gpa
fwrite(nLine, sizeof(nLine), 1, binfile);//new line
}
fclose(binfile);
fclose(textfile);
return 0;
}
答案 0 :(得分:0)
问题在于,每次在输出文件中写入一个字符串时,都会写入256字节,因为sizeof(firstName)
等于256(请参阅声明,每个字符1个字节* 256)。
正确的解决方案是在编写字符串时使用strlen
函数(字符串的长度)而不是sizeof
。但C中的字符串必须以\0
字符结尾。当您读取字符串时,默认情况下,您的字符数组(firstName,lastName)最后会填充字符串和\0
字符。所以你只需要输出最后一个字节的字符串,这就是你为一个字符串写的实际字节数为sizeof(string)+1
的原因:
...
fwrite(firstName, strlen(firstName)+1, 1, binfile);//first name
fwrite(space, sizeof(space), 1, binfile);//space
fwrite(lastName, strlen(lastName)+1, 1, binfile);//last name
fwrite(space, sizeof(space), 1, binfile);//space
fwrite(&id, sizeof(unsigned int), 1, binfile);//ID
fwrite(space, sizeof(space), 1, binfile);//space
fwrite(&gpa, 4, 1, binfile);//gpa
...