2013-03-20 23 views
-2

在我的程序中,我从键盘接收输入。我把这个输入放在一个包含两个char字段和1 int字段的struct中。我怎样才能使用函数写入整个struct如何在文件中写入完整的结构?

不要想要分别写入struct的每个成员。

+0

目前还不清楚你在问什么。你可以添加一些代码到你的问题,所以我们可以更好地理解它? – 2013-03-20 11:37:49

+1

只需将指针的结构传递给指令即可。你不需要写成员。 – Abhineet 2013-03-20 11:41:03

+0

我会稍后添加,现在我只能使用智能手机进行互联网 – Mitro 2013-03-20 11:49:01

回答

1

这取决于您的struct是如何定义的,您是否希望您的输出是人类可读的,以及是否要在不同的体系结构上读取输出文件。

fwrite解决方案,别人给予将写入结构到输出文件的二进制表示。例如,给定代码如下:

#include <stdio.h> 

int main(void) 
{ 
    struct foo { 
    int x; 
    char name1[10]; 
    char name2[10]; 
    } items[] = {{1,"one","ONE"}, {2,"two","TWO"}}; 

    FILE *output = fopen("binio.dat", "w"); 

    fwrite(items, sizeof items, 1, output); 

    fclose(output); 
    return 0; 
} 

如果我显示binio.dat内容到控制台,得到以下:

 
[email protected]:~/Development/Prototypes/C/binio$ cat binio.dat 
[email protected]:~/Development/Prototypes/C/binio$ 

[email protected]:~/Development/Prototypes/C/binio$ od -c binio.dat 
0000000 001 \0 \0 \0 o n e \0 \0 \0 \0 \0 \0 \0 O N 
0000020 E \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 
0000040 \0 \0 \0 \0 002 \0 \0 \0 t w o \0 \0 \0 \0 \0 
0000060 \0 \0 T W O \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 
0000100 \0 \0 \0 \0 \0 \0 \0 \0 
0000110 

的整数值显示为垃圾(上面未重放)因为它们已经以字节序列01,00,00,00和02,00,00,00(x86是little-endian)存储,它们不是可打印字符。还要注意,name1的所有10个字符和name2的所有20个字符都被写入该文件,该文件可能是或不是您想要的。

的情况得到,如果你的结构包含更加复杂的指针,因为什么被存储到文件指针值,而不是被指着的事情:

#include <stdio.h> 

int main(void) 
{ 
    struct foo { 
    int x; 
    char *name1; 
    char *name2; 
    } items[] = {{1,"one","ONE"}, {2,"two","TWO"}}; 

    FILE *output = fopen("binio.dat", "w"); 

    fwrite(items, sizeof items, 1, output); 

    fclose(output); 
    return 0; 
} 

这一次我得到

 
[email protected]:~/Development/Prototypes/C/binio$ cat binio.dat 
��������[email protected]:~/Development/Prototypes/C/binio$ 

[email protected]:~/Development/Prototypes/C/binio$ od -c binio.dat 
0000000 001 \0 \0 \0 260 205 004 \b 264 205 004 \b 002 \0 \0 \0 
0000020 270 205 004 \b 274 205 004 \b 
0000030 

请注意,根本没有任何字符串出现在文件中;如果您使用不同的程序读取此文件,它将看到的所有内容(很可能)都是无效地址。

如果你希望你的输出为人类可读你希望能够在不同的体系结构来读取这些值,你几乎必须去与格式化输出,这意味着你必须单独写每个成员:

#include <stdio.h> 

int main(void) 
{ 
    struct foo { 
    int x; 
    char *name1; 
    char *name2; 
    } items[] = {{1,"one","ONE"}, {2,"two","TWO"}}; 

    FILE *output = fopen("binio.dat", "w"); 
    int i; 
    for (i = 0; i < sizeof items/sizeof items[0]; i++) 
    { 
    fprintf(output, "%d %s %s\n", items[i].x, items[i].name1, items[i].name2); 
    } 
    fclose(output); 
    return 0; 
} 
 
[email protected]:~/Development/Prototypes/C/binio$ cat binio.dat 
1 one ONE 
2 two TWO 

你当然可以换行操作在你自己的功能,像

int printFoo(FILE *output, const struct foo item) 
{ 
    return fprintf(output, "%d %s %s\n", item.x, item.name1, item.name2); 
} 

,但最终,这个过程非常简单。

如果您不关心可读性和可移植性,fwrite解决方案的效果很好,但如果在结构中有任何指针成员,您仍然必须小心。

4

C没有“说明”。

您应该能够使用一个单一的函数调用,如:

fwrite(&mystructure, sizeof mystructure, 1, myfile); 

但是,这也不是没有缺点:

  1. 这使得该文件格式取决于你目前的CPU和编译器,这通常是一个坏主意;它会使保持互操作性变得非常困难。
  2. 写入可能部分成功;你需要把它包装在一个循环中。