【问题标题】:C - File management, unable to obtain desired outputC - 文件管理,无法获得所需的输出
【发布时间】:2018-11-28 09:42:46
【问题描述】:

我正在做我的学校作业,我遇到了我的第一个主要障碍......我无法写入文件,甚至无法使用 scanf 和 fgets 检索输入。

问题一:

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);  

这是一个小sn-p;使用上面的代码,我无法检索输入的输入并将其打印在显示器上/到文件中。

我的意图是有 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 的使用是否正确/合适。

感谢您的帮助。

【问题讨论】:

  • date_trans[i][j]char,而不是 char *
  • @PaulOgilvie 嗨,感谢您的评论。您能否详细说明为什么 date_trans[i] 是 char* 而 date_trans[i][j] 不是?
  • 'else' 语句需要括号。识别是不够的!
  • 并在“for j”循环中用括号括住 fgets 和 printf 语句。这不是 Python!
  • date_trans 是一个字符串数组。 date_trans[i] 是一个字符串,因此指向组成字符串的字符。编译器将其解释为指向 char 的指针。

标签: c arrays string file-management


【解决方案1】:

我发现您显示的代码有两个问题:

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

为了解决这两个问题,不要有内循环,而是在外循环

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

printf 调用中也存在第 1 个问题,您将单个 char 传递给需要 char * 的格式。

最后,关于您对包含 15 个字符的字符串的要求的说明:不要忘记空终止符,它还需要数组中的空格。这意味着您目前有 14 个字符加上终止符的位置。

【讨论】:

  • fgets(data_trans[i], sizeof data_trans[i], f1); --> fgets(data_trans[i], sizeof data_trans[i], stdin); OP打算从stdin读入。
  • 谢谢,但我还是不明白。我刚刚读到 char* 是指向 char 的指针,所以我不明白为什么 2d 会是 char 类型而不是 char* 类型。它是一个二维数组非常重要,因为我需要读取多个字符串。
  • @partynextdoor18 data_trans 的类型为 char [100][15]data_trans[i] 的类型为 char [15]。而data_trans[i][j] 的类型为char。 IE。 data_trans[i][j] 不是“字符串”,而是单个字符。
  • @Someprogrammerdude 是的,我知道这一点。如果是这样,如果不是我在主帖中采用的方法,我将如何拥有一个 100 行 15 列 ([100][15]) 的数组,所以 100 个字符串,每个字符串最多 15 个字符?
  • @partynextdoor18 就像我在回答中所说的那样:没有内部循环,而是显示的fgets 调用。
【解决方案2】:

改变这个

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2022-01-22
    • 2017-07-04
    • 2021-10-04
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多