C:基于先前输入的多行输入

时间:2018-10-09 04:40:13

标签: c

因此,我应该基本上将用户写的内容转换为文本文档。但是,行数会有所不同。它将始终为3列。

这是正在运行的程序的示例实例:

How many jobs?: 4
Enter processing time for each: 10 13 12
20 39 10
7 29 13
13 18 19

由于用户输入的作业数量为“ 4”。用户可以输入4条不同的行。我想保存此输入,以便程序完成后可以对此进行文本处理。

这是我的代码中执行此操作的部分:

int jobs;
printf("How many jobs?: ");
scanf("%d", &jobs);

int ptimes[jobs];
int n = 0;
printf("Enter processing time for each: ");

for (ptimes[0]; ptimes[jobs] ; ptimes[jobs++]) {
     scanf("%d", ptimes[n]);
     n = n + 1;

    }

我的问题是我无法在行中单独存储每个数字。另外,我不能做3列。另外,此代码对我来说无法正常工作。我通过添加具有相同条件的for循环进行了测试,但是在ptimes中打印了每个变量,但这没有用。

1 个答案:

答案 0 :(得分:2)

尽管您的for循环毫无意义,但是您以一种非常尴尬的方式来解决问题。当您的目标是读取一行数据时,那么您应该考虑使用面向 line _ 的输入函数,而不要读取单个整数。

例如,如果用户要输入4个职位的数据,那么您可以读取和验证每个职位3个整数,或者仅要求将每个职位数据输入一行,然后读取并写入文件行。

您可以通过提供足够大小的缓冲区来容纳用户将在每一行中输入的所有预期字符来非常简单地做到这一点(不要忽略缓冲区大小)。然后,只需使用面向{em> line 的输入函数之一(如fgets或POSIX getline来读取每一行,然后使用{{1} }(fputsfgets在这里是很好的组合)

例如,要最小化您的情况,您可以执行以下操作:

fputs

使用/输出示例

#include <stdio.h>

#define MAXC  1024
#define OFILE "jobs.txt"

int main (void) {

    char buf[MAXC];
    int nlines = 0, n = 0;
    FILE *fp = fopen (OFILE, "w");

    if (!fp) {  /* validate file is open for writing */
        perror ("fopen-file open failed");
        return 1;
    }

    printf ("How many Jobs? ");
    if (scanf ("%d", &nlines) != 1) {
        fputs ("error: invalid integer input.\n", stderr);
        return 1;
    }
    fgets (buf, MAXC, stdin);   /* read and discard trailing '\n' */

    while (n < nlines && fgets (buf, MAXC, stdin)) { /* read lines */
        fputs (buf, fp);    /* write lines  */
        n++;                /* update count */
    }
    if (fclose(fp) == EOF)
        perror ("fclose-stream error");

    return 0;
}

示例输出文件

$ ./bin/fgets_fputs
How many Jobs? 4
10 13 12
20 39 10
7 29 13
13 18 19

现在,除了简单地读取用户输入的每一行数据外,明智的做法是在写入文件之前验证每个行中是否包含3个整数,并且如果没有提供错误并要求用户重新输入数据, 。只需花费更多的精力,例如

$ cat jobs.txt
10 13 12
20 39 10
7 29 13
13 18 19

使用/输出示例

    /* no changes above */
    ...
    fgets (buf, MAXC, stdin);   /* read and discard trailing '\n' */

    printf (" enter data for job[%2d]: ", n + 1);   /* prompt for data */
    while (fgets (buf, MAXC, stdin)) { /* read lines */
        int i1, i2, i3;
        /* validate 3-integers provided */
        if (sscanf (buf, "%d %d %d", &i1, &i2, &i3) == 3) {
            fputs (buf, fp);    /* write lines  */
            n++;                /* update count */
        }
        else    /* otherwise, handle error */
            fputs ("  error: invalid input.\n", stderr);

        if (n < nlines) /* if lines remain to read, prompt */
            printf (" enter data for job[%2d]: ", n + 1);
        else    /* otherwise break the loop */
            break;
    }
    ...
    /* no changes below */

输出文件相同。