2011-02-25 81 views
0

我正在尝试将结构指针写入文件。我想要写的是一个指向字符缓冲区的结构指针,然后从缓冲区中检索指针,最后将整个结构写入文件。使用fwrite将结构指针写入文件

而不是写整个结构,我得到文件中的垃圾数据。

我在代码中丢失了什么或者犯了一些错误。

完全粘贴我的测试代码。

#include <stdio.h> 
# include<stdlib.h> 
#include <string.h> 
typedef struct dummy_s { 

    int a; 
} dummy_t; 

void main(int argc, char* argv) 
{ 


    char *s1; 
    s1 = malloc(sizeof(dummy_t)*1000); 
    dummy_t * tmp1; 
    tmp1 = (dummy_t *)s1; 
    tmp1 -> a = 100; 
    FILE *f; 
    f = fopen("dummyfile.txt","w"); 
    dummy_t * tmp = NULL; 
    tmp = malloc(sizeof(dummy_t)); 
    memcpy(tmp, s1, sizeof(dummy_t)); 
    fwrite(tmp,sizeof(struct dummy_s),1,f); 
    fclose(f); 
} 

[编者对于编译错误 - 对不起] 干杯! Naren

+0

那么fwrite()调用甚至编译...? (我没有C编译器) – 2011-02-25 13:44:28

+4

什么是一堆疯狂的操作...... – pmod 2011-02-25 13:45:23

+1

什么是memcpy中的“d”(tmp,d,sizeof(dummy_t));? – pmod 2011-02-25 13:48:00

回答

0

是否要将结构作为文本或二进制文件写入文件?

如果您想将其编写为文本,请先使用sprintf将您的号码转换为其文本表示,例如,

char buf[100]; 
sprintf (s, "%d", tmp->a); 

然后使用fputs将buf写入文件。

如果你想制作一个二进制文件,一定要用“w”而不是“wb”打开文件。 否则,运行时可能会将某些字符转换为其他字符(例如换行符变为回车+换行符)。 “wb”中的'b'告诉fopen你想用二进制方式写文件,根本不执行任何字符转换。

1

对不起,但我会有点粗鲁。如果您发布了代码段,请确保它编译正确。你的代码使用了一个变量“d”,它没有被定义,它需要“sizeof dummy”(并且我没有在这里看到一个虚拟物体,至少在代码中没有),它缺少一堆#include:秒。

修复编译错误(使用tmp1而不是d)时,它似乎正常工作。请注意,您生成的“文本文件”包含结构的二进制表示,而不是文本文件。 (假设一个32位的小端机器,你会净值为100的字节,然后是4的值为0)。

此外,我没有看到需要最后一个malloc和memcpy,fwrite应该能够直接写出原始数组的内容。

+0

@Partick和@Lindydancer嗨,抱歉编译问题。我的错。它的工作原理是,首先将结构写入缓冲区,然后从缓冲区中提取并写入文件。因此,缓冲区“s1”。我刚才提到的场景属于只写一次结构。不过,我打算多次写这个结构。我想,这应该解释为什么需要“tmp1”,“malloc”和“memcpy” – tracemein 2011-02-25 14:25:27