gpt4 book ai didi

c - 在c中将int结构数据类型写入文件

转载 作者:行者123 更新时间:2023-11-30 17:37:48 25 4
gpt4 key购买 nike

我的程序的一些背景知识。我要求用户输入两种不同颜色晶体的坐标。这将保存在一个结构中,然后写入文件,稍后由程序读回(函数尚未编写)。

我查看了论坛和博客,但我似乎只找到与字符数组相关的结果,而我使用的是 int 数组。

在将数据写入文件之前,我的代码工作正常。 (这是代码片段)

char fname[20];
FILE *fp;
int loop;
struct coord{
int x;
int y;
};

for(loop=0;loop<3;loop++){
printf("Enter MAGENTA X coordinate: \n");
scanf("%2d",&mg[loop].x);
printf("Enter MAGENTA Y coordinate: \n");
scanf("%2d",&mg[loop].y);
printf("\n\n");
}

for(loop=0;loop<3;loop++){
printf("Enter YELLOW X coordinate: \n");
scanf("%2d",&ylw[loop].x);
printf("Enter YELLOW Y coordinate: \n");
scanf("%2d",&ylw[loop].y);
printf("\n\n");
}

clrscr();

printf("\nDetail entered:");
printf("\n\n\tMagenta\t\tYellow\n");
for(loop=0;loop<3;loop++){
printf("\tx %d,%d y\tx %d,%d y\n",mg[loop].x,mg[loop].y,ylw[loop].x,mg[loop].y);
}

printf("\n\nPlease save your data. Enter file name: ");
gets(fname);
fp=fopen(fname,"w");

for(loop=0;loop<3;loop++){
fprintf(fp,"%d,%d ",mg[loop].x,mg[loop].y);
fprintf(fp,"%d,%d ",ylw[loop].x,ylw[loop].y);
}

fclose(fp);

提前谢谢您。

最佳答案

将数据写入文件的方式没有任何问题(也许除了您应该检查 fopen 的返回值。)

您的问题在于从 stdin 输入数据。首先,使用 scanf 读取一堆坐标。 scanf 不是基于行的格式;它像对待任何其他空白一样对待换行符。

然后您使用 gets,但实际上不应该使用 fgets,因为它允许您指定最大缓冲区大小,以免溢出您的缓冲区为 20。

好吧,假设您使用 fgets,这是一种基于行的格式。混合使用 scanffgets 时必须小心,因为它们的工作方式不同。此外,来自控制台的输入通常会被缓冲,直到下一个换行符全部刷新,这可能会在屏幕上看到的内容与程序处理输入的方式之间产生差异。

假设您使用 scanf 读取两个数字,然后使用 fgets 读取文件名。您的输入如下所示:

1  2  \n  5  1  \n  d  a  t  a  .  t  x  t
a a b b b c

读取第一个数字后,输入标记位于数字之后、换行符之前。 scanf 会跳过使用 "%d" 读取数字之前的空格,因此会读入第二个数字,但同样,输入会在换行符之前停止。然后你用fgets读取一行并读取直到下一个换行符的所有内容,这什么也没有。真正的文件名将被下一个扫描函数读取,但没有,所以它被丢弃。

(这就是你的 str != NULL 的来源:它是一个在 fopen` 中失败的断言。不过,这不是编译器所做的事情。当你运行程序时,它已经被编译了。运行时库会对编译时无法知道的条件进行错误检查。)

(更糟糕的是:fgetsgets 不同,在读取字符串后保留换行符。您也应该删除该换行符以及可能的其他前导和尾随空格。否则你最终会得到一个包含换行符的文件名,这并不好笑。)

无论如何,你该如何解决这个问题?将 scanf 格式从 "%d" 更改为带有尾随空格的 "%d "。 “Space”的含义是 scanf:读取任意数量的空白。

或者,您可以坚持使用 scanf 并使用 scanf("%19s ", filename) 读取文件名。这样做的好处是可以读取其中没有任何空格的字符串。

据报道,您已通过在读取文件名之前调用 fflush(stdin) 修复了此问题。输入流上的 fflush 行为取决于实现,并且不受标准保证。如果它对您有用,请保留它。

关于c - 在c中将int结构数据类型写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22284834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com