写入二进制文件

时间:2017-02-12 21:38:13

标签: c input binary output

编写一个程序,从文本文件中读取数据并将其输出到二进制文件。我很确定我正在正确读取文件,因为当我打印信息时它确实正确。但是,写入二进制文件是不正确的。文本文件的每一行都显示为:

  

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;
}

1 个答案:

答案 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
...