C-文件管理,无法获得所需的输出

时间:2018-11-28 09:42:47

标签: c arrays string file-management

我正在做学校作业,遇到了第一个主要障碍……我无法写文件,甚至无法使用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);  

这是一个小片段;使用上面的代码,我无法检索输入的输入并将其打印出来显示在文件上。

我的意图是拥有100个字符串,每个字符串最多15个字符。

所以说,如果我要输入一个日期,例如18/12/15或18-12-15,或一个单词,例如“ Daniel”,则在按Enter键后程序会突然停止几秒钟,然后继续执行显示“按任意键...”。

我也收到此错误...

[Warning] ...\assignment\test.c:22: warning: passing arg 1 of `fgets' makes pointer from integer without a cast

我真的不理解它,因为变量date_trans是一个字符串/一个二维字符数组,而不是整数,对吧?


编辑:

问题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的使用是否正确/适当。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

我看到您显示的代码出现 两个 问题:

  1. 您收到警告,因为date_trans[i][j]char,而不是char *
  2. 您的内部循环从020(包括),您可以将其用作包含15个元素的数组的索引(即,索引从014 )。

要解决这两个问题,请不要使用内部循环,而要在外部执行

fgets(data_trans[i], sizeof data_trans[i], stdin);

问题编号1也存在于printf调用中,在该调用中,您将单个char传递为期望char *的格式。

最后,请注意您对包含15个字符的字符串的要求:不要忘记null终止符,以及数组中也需要空格。这意味着您当前可以放置 14 个字符以及终止符。

答案 1 :(得分:0)

更改此

    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进行循环。