C - 文件管理,无法获得想要的输出
C - File management, unable to obtain desired output
我正在做我的学校作业,我遇到了我的第一个主要障碍......我无法写入文件,甚至无法使用 scanf 和 fgets 检索输入。
问题 1:
FILE *f1;
char date_trans[100][15];
f1 = fopen("test.txt", "w");
if (f1 == NULL)
printf("File could not be opened.\n");
else
printf("Enter details (sender, receiver, amount.)\n");
for(i = 0; i <= element; i++)
{
for(j = 0; j <= 20; j++)
fgets(date_trans[i][j], 15, stdin);
printf("%s", date_trans[i][j]);
}
fclose(f1);
这是一个小片段;使用上面的代码,我无法检索输入的内容并将其打印到 display/to 文件中。
我的意图是有 100 个字符串,每个字符串最多 15 个字符。
所以假设我要输入像 18/12/15 或像 18-12-15 这样的日期,或者像 "Daniel" 这样的词,程序会在我按下 enter 后突然停止几秒钟然后继续显示 "Press any key...".
我也收到这个错误...
[Warning] ...\assignment\test.c:22: warning: passing arg 1 of `fgets' makes pointer from integer without a cast
我真的不明白,因为变量 date_trans 是一个 string/an 二维字符数组,不是整数,对吧?
编辑:
问题 2:
for (j=0; j <= 50 || !feof(f1); j++); // f1 opened in 'r' mode.
{
fscanf(f1, "%s %d %s %d %s %f", date_trans[j], &accsend[j], accnames[j],
&accreceive[j], accnamer[j], &amount_trans[j]);
printf("%d %s %d %s %d %s %.2f\n", j+1, date_trans[j], accsend[j], accnames[j],
accreceive[j], accnamer[j], amount_trans[j]);
}
在上面的代码中,我尝试使用以读取模式打开的函数 fscanf 通过流 f1 输入数据。但是输出使程序挂起,我也无法在程序中键入或执行任何操作。
另外,请指教我对!feof的用法是不是correct/appropriate。
感谢您的帮助。
改变这个
fgets(date_trans[i][j], 15, stdin);
printf("%s", date_trans[i][j]);
到
fgets(date_trans[i], 15, stdin);
printf("%s", date_trans[i]);
date_trans[i][j]
是 char
类型而不是 char *
。你也不需要 j
for loop.
我看到 两个 您显示的代码有问题:
- 您收到的警告,因为
date_trans[i][j]
是 char
,而不是 char *
- 您的内部循环从
0
到 20
(含),您将其用作包含 15 个元素的数组的索引(即从 0
到 [=17= 的索引) ])。
为了解决这两个问题,不要有内部循环,而是在外部做
fgets(data_trans[i], sizeof data_trans[i], stdin);
问题编号 1 也存在于 printf
调用中,您将单个 char
传递给需要 char *
.
的格式
最后,请注意您对包含 15 个字符的字符串的要求:不要忘记空终止符,它还需要数组中的 space。这意味着您当前可以容纳 14 个字符和终止符。
我正在做我的学校作业,我遇到了我的第一个主要障碍......我无法写入文件,甚至无法使用 scanf 和 fgets 检索输入。
问题 1:
FILE *f1;
char date_trans[100][15];
f1 = fopen("test.txt", "w");
if (f1 == NULL)
printf("File could not be opened.\n");
else
printf("Enter details (sender, receiver, amount.)\n");
for(i = 0; i <= element; i++)
{
for(j = 0; j <= 20; j++)
fgets(date_trans[i][j], 15, stdin);
printf("%s", date_trans[i][j]);
}
fclose(f1);
这是一个小片段;使用上面的代码,我无法检索输入的内容并将其打印到 display/to 文件中。
我的意图是有 100 个字符串,每个字符串最多 15 个字符。
所以假设我要输入像 18/12/15 或像 18-12-15 这样的日期,或者像 "Daniel" 这样的词,程序会在我按下 enter 后突然停止几秒钟然后继续显示 "Press any key...".
我也收到这个错误...
[Warning] ...\assignment\test.c:22: warning: passing arg 1 of `fgets' makes pointer from integer without a cast
我真的不明白,因为变量 date_trans 是一个 string/an 二维字符数组,不是整数,对吧?
编辑:
问题 2:
for (j=0; j <= 50 || !feof(f1); j++); // f1 opened in 'r' mode.
{
fscanf(f1, "%s %d %s %d %s %f", date_trans[j], &accsend[j], accnames[j],
&accreceive[j], accnamer[j], &amount_trans[j]);
printf("%d %s %d %s %d %s %.2f\n", j+1, date_trans[j], accsend[j], accnames[j],
accreceive[j], accnamer[j], amount_trans[j]);
}
在上面的代码中,我尝试使用以读取模式打开的函数 fscanf 通过流 f1 输入数据。但是输出使程序挂起,我也无法在程序中键入或执行任何操作。
另外,请指教我对!feof的用法是不是correct/appropriate。
感谢您的帮助。
改变这个
fgets(date_trans[i][j], 15, stdin);
printf("%s", date_trans[i][j]);
到
fgets(date_trans[i], 15, stdin);
printf("%s", date_trans[i]);
date_trans[i][j]
是 char
类型而不是 char *
。你也不需要 j
for loop.
我看到 两个 您显示的代码有问题:
- 您收到的警告,因为
date_trans[i][j]
是char
,而不是char *
- 您的内部循环从
0
到20
(含),您将其用作包含 15 个元素的数组的索引(即从0
到 [=17= 的索引) ])。
为了解决这两个问题,不要有内部循环,而是在外部做
fgets(data_trans[i], sizeof data_trans[i], stdin);
问题编号 1 也存在于 printf
调用中,您将单个 char
传递给需要 char *
.
最后,请注意您对包含 15 个字符的字符串的要求:不要忘记空终止符,它还需要数组中的 space。这意味着您当前可以容纳 14 个字符和终止符。