在c中将结构写入文件

时间:2014-02-09 02:53:22

标签: c struct fwrite

这是我的代码,我在“example.txt”中读取256个字节并将其存储在chunk.payload中。

我希望能够先将结构写入“write.txt”,然后将我读到的内容写入“write.txt”。我能够使用fwrite将chunk.payload中的所有内容写入该文件,但是我无法将整个结构文件写入该文件。

#define MAXSIZE 256
int main(void){
    FILE *fp = fopen("C:\\Users\\alice\\Desktop\\example.txt", "r");
    FILE *wr = fopen("C:\\Users\\alice\\Desktop\\write.txt", "w+");

    struct packet{
      unsigned short block_num;
      unsigned short block_size;
      unsigned short crc;
      unsigned char *payload;
    };

    /*Create A dummy packet */
    struct packet chunk;
    chunk.block_num = 0;
    chunk.block_size = 256;
    chunk.crc = 0x101001;
    chunk.payload = malloc(MAXSIZE + 1);  // allocating memory
    chunk.payload[MAXSIZE] = '\0';

    //read first 256 lines and store into chunk.payload
    int read = fread(chunk.payload, sizeof(char), MAXSIZE, fp);  

    // Write struct to write.txt
    fwrite(&chunk, sizeof(chunk), 1, wr);

    // Write whatever has been read so far to write.txt
    fwrite(chunk.payload, sizeof(char), read, wr);

    getch();
    fclose(fp);
    fclose(wr);
    return 0;

我写电话的方式:

fwrite(&chunk, sizeof(chunk), 1, wr);

实际上允许我编译代码,但我最终在我读取的256个字节写入我的文件之前将随机符号写入我的文件

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:1)

您的第一个fwrite正在尝试将数据包结构的二进制内容写入write.txt文件:

// Write struct to write.txt
fwrite(&chunk, sizeof(chunk), 1, wr); 

第二个:

// Write whatever has been read so far to write.txt
fwrite(chunk.payload, sizeof(char), read, wr); 

正在编写malloc有效负载的内容。我认为您不想将二进制文件写入文件。如果要在有效负载之前将数据包结构值作为文本写入文件,则必须逐个执行类似fprintf的操作,例如

// write contents of 'chunk' to text file
fprintf( wr, "block_num= %d\n", chunk.block_num );
...
fwrite(chunk.payload, sizeof(char), read, wr);

另请注意,如果读取小于MAXSIZE,则有效负载文本将无法正确终止。

答案 1 :(得分:0)

Payload是字符数据类型,结构的其他成员是整数。您正在创建文本文件。因此,将整数转换为字符,然后写入write.txt

这样也是可能的;

typedef struct Test
{
int a,b,c, d;
}Ref;

main()    {

 fp=fopen("/home/test_prog/sampe.txt", "w+");
 sprintf (data, "%d %d %d %d", example.a, example.b, example.c, example.d);
 fwrite (data, sizeof(char), strlen(data) , fp  );
 fclose (fp);

}

答案 2 :(得分:0)

freadfwrite通常用于读/写二进制数据。您想要编写文本数据,通常使用fscanffgets进行输入,fprintf进行输出。

答案 3 :(得分:0)

chunk 结构包含指向有效负载的指针。这些是你看到的“垃圾”角色。由于您无论如何都要将有效负载大小限制为MAXSIZE,您可以将有效负载设置为静态大小:

struct packet{
  unsigned short block_num;
  unsigned short block_size;
  unsigned short crc;
  unsigned char payload[MAXSIZE];
};

这还有一个额外的好处,就是不用保存指针,使用堆等。在这种情况下,你的第一个 fwrite 会写出整个东西,包括有效负载和你的第二个 fwrite < 不需要。

如果您需要任意大小的有效负载,那么您可以使用这个老技巧:

struct packet{
  unsigned short block_num;
  unsigned short block_size;
  unsigned short crc;
  unsigned char payload[0];
};

/*Create A dummy packet */
struct packet *chunk;
chunk = (struct packet *)malloc(sizeof(struct packet) + packetsize + 1);
chunk->block_num = 0;
chunk->block_size = 256;
chunk->crc = 0x101001;
chunk->payload[packetsize] = '\0';

然后您需要将第一个 fwrite 更新为:

// Write struct to write.txt
fwrite(chunk, sizeof(*chunk) + packetsize, 1, wr);

注意:在这种情况下,您仍然不需要第二个 fwrite

另外,如果你想保存,也不要忘记为NUL终止符添加一个。