【发布时间】:2015-04-01 14:07:19
【问题描述】:
我在使用 fread/fwrite 函数读取和写入文件结构时遇到问题。首先,由 fwrite 编写的文本对我来说是不可读的,但据我所见,它旨在像这样工作。有没有办法让它变成纯文本,还是必须这样?
另一个问题是,当我尝试使用 fread 函数从该文件中读取时,没有读取最后几个元素。
此外,我需要这段代码直接在磁盘上对文件中的数据进行排序。必须使用 fread/fwrite..
#include <stdio.h>
typedef struct camesi {
char camasa[33];
char culoare[33];
int marime;
char material[33];
} cam;
int main() {
FILE *f, *f2;
int i, j, n;
cam a, b, c;
n = 13;
f = fopen ("new.txt", "w+");
f2 = fopen ("asd.txt", "r");
rewind (f2);
for (i = 0; i < n; i++) {
fscanf (f2, "%s%s%d%s", c.camasa, c.culoare, &c.marime, c.material);
printf ("%s\t%s\t%d\t%s\n", c.camasa, c.culoare, c.marime, c.material);
fwrite (&c, sizeof (cam), 1, f);
}
printf ("\n----------------------------------------\n\n");
rewind (f);
for (i = 0; i < n; i++) {
fread (&c, sizeof (cam), 1, f);
printf ("%s\t%s\t%d\t%s\n", c.camasa, c.culoare, c.marime, c.material);
}
return 0; }
这是控制台的输出:
asdf1 blue 45 skin
asdf2 green 43 skin
asdf3 white 49 skin
asdf4 red 47 skin
asdf5 yellow 54 skin
asdf6 purple 13 skin
asdf7 magenta 74 skin
asdf8 pink 41 skin
asdf9 black 97 skin
asdf10 gray 85 skin
asdf11 orange 26 skin
asdf12 violet 64 skin
asdf13 brown 11 skin
----------------------------------------
asdf1 blue 45 skin
asdf2 green 43 skin
asdf3 white 49 skin
asdf4 red 47 skin
asdf5 yellow 54 skin
asdf6 purple 13 skin
asdf7 magenta 74 skin
asdf8 pink 41 skin
asdf9 black 97 skin
asdf10 gray 85 skin
asdf11 orange 85 skin
asdf11 orange 85 skin
asdf11 orange 85 skin
前半部分是从手动创建的 *.txt 文件中读取的数据。
另一半是从程序创建的文件中读取的数据,使用 fwrite 函数。
原始 *.txt 文件的内容:
asdf1 blue 45 skin
asdf2 green 43 skin
asdf3 white 49 skin
asdf4 red 47 skin
asdf5 yellow 54 skin
asdf6 purple 13 skin
asdf7 magenta 74 skin
asdf8 pink 41 skin
asdf9 black 97 skin
asdf10 gray 85 skin
asdf11 orange 26 skin
asdf12 violet 64 skin
asdf13 brown 11 skin
使用 fwrite 函数创建的文件内容:
asdf1 €M o ёю( Ђ(wїдЂ‚юяяяblue M - skin M `M А&M €ю( HЯПt M asdf2 €M o ёю( Ђ(wїдЂ‚юяяяgreen M + skin M `M А&M €ю( HЯПt M asdf3 €M o ёю( Ђ(wїдЂ‚юяяяwhite M 1 skin M `M А&M €ю( HЯПt M asdf4 €M o ёю( Ђ(wїдЂ‚юяяяred e M / skin M `M А&M €ю( HЯПt M asdf5 €M o ёю( Ђ(wїдЂ‚юяяяyellow M 6 skin M `M А&M €ю( HЯПt M asdf6 €M o ёю( Ђ(wїдЂ‚юяяяpurple M
skin M `M А&M €ю( HЯПt M asdf7 €M o ёю( Ђ(wїдЂ‚юяяяmagenta M J skin M `M А&M €ю( HЯПt M asdf8 €M o ёю( Ђ(wїдЂ‚юяяяpink ta M ) skin M `M А&M €ю( HЯПt M asdf9 €M o ёю( Ђ(wїдЂ‚юяяяblack a M a skin M `M А&M €ю( HЯПt M asdf10 €M o ёю( Ђ(wїдЂ‚юяяяgray a M U skin M `M А&M €ю( HЯПt M asdf11 €M o ёю( Ђ(wїдЂ‚юяяяorange M skin M `M А&M €ю( HЯПt M asdf12 €M o ёю( Ђ(wїдЂ‚юяяяviolet M @ skin M `M А&M €ю( HЯПt M asdf13 €M o ёю( Ђ(wїдЂ‚юяяяbrown M skin M `M А&M €ю( HЯПt M
【问题讨论】:
-
如果你想要“可读”的输出,你可以切换到
fprintf和fscanf函数。顺便提一句。 “直接在磁盘上”排序是个坏主意,除非你的内存绝对不足。 -
您的结构在编写它们时不会清除
char[33]字段中的多余字符,因此它们充满了当时内存中的任何垃圾。 -
缺少的元素应该是因为一些
fwrite()s 仍在缓冲中。在写和读之间调用fflush(f)(并检查fread()的结果) -
@IngoLeonhardt 这不应该是相关的 - 缓冲只影响 other 程序是否可以看到未刷新的数据。
-
@user4419802 不幸的是,fread/fwrite 的使用是强制性的,以及在磁盘上进行排序.. 使用打印和扫描以及在 RAM 中进行所有操作会使事情变得更容易,但我已经完成的任务收到的限制..
标签: c