从文本文件添加行/列

时间:2016-07-23 01:29:27

标签: c arrays file io

基本上第一行是100 100 100 100 100,但我对如何实际读取每一行并将它们加在一起以打印到屏幕上感到迷茫。 第一列有20个整数,我也需要添加它们。我意识到我需要一个数组,但是我需要两个数组还是只需要原始网格数组?

#include <stdio.h>

#define ROWS 20
#define COLS 5

int main() {

// Open the input file and read in the number of cases to process.
FILE* ifp;
FILE* marketOut;

ifp = fopen("marketing.txt", "r");
marketOut = fopen("marketing.out.txt", "w");

int loop, numCases;
fscanf(ifp, "%d", &numCases);

// Go through each input case.
for (loop=0; loop<numCases; loop++)
{

// Get this input grid.
int grid[ROWS][COLS], i, j, x;
int a=0;
int nums[100];

x=0;


    for (i=0; i<ROWS; i++)
        for (j=0; j<COLS; j++)
            fscanf(ifp, "%d", &grid[i][j]);

    // Will store best value for row or column.
    int best = 0;

    while (i<ROWS)
        {
            x=grid[i]+i;

        }



    printf("x=%d", x);


    // Output result.
    printf("%d\n", best);
}

fclose(ifp);
fclose(marketOut);
return 0;
}

1 个答案:

答案 0 :(得分:0)

如果我了解您的问题,您的文件marketing.txt在第一行有一个不相关的值(至少在我的理解中),后面跟500-rows每个5-values行。面临的挑战是为每组20-lines(每个行和组的rowcol小计)计算各种总计,最后为rowcol总计该文件以及其他各种最大/分钟。

您将获得一些基本文件 marketing-scaffold.c ,其中包含您发布的代码的基本子集。为了处理数据,您要填充/重新填充2D数组,然后计算总和。我将把2D数组处理留给你,因为这似乎是项目的开玩笑,但将有助于组织循环结构来处理重复的总和。

首先,2D数组不是计算行/列总和所必需的。在那里,您只需要为20行块和整个文件保持运行总计。每行的行和只是每行中每个元素的总和。

读取文件,需要读取/丢弃第一行(fgets与其他任何内容一样有意义)。丢弃第一行后,基本上每行读取五个整数值,以二十个为一组,直到遇到EOF。为此你可以做类似的事情:

enum { NCOL = 5, NSUM, NROW = 20, MAXC = 256 };  /* constants */
...
    int idx = 0;                /* row index */
    ...
    for (;;) {                  /* for all 20 line blocks in file */
        int row[NCOL] = {0},                    /* row values     */
            n = NROW, rtn = 0;
            ...
        while (n-- && (rtn = fscanf (fp, " %d %d %d %d %d", &row[0], &row[1],
               &row[2], &row[3], &row[4])) == NCOL && rtn != EOF) {
            int rsum = 0;
            /* compute row/col sums
               ... */
            } /* output row values | row sum */
            printf (" row [%3d]     %3d %3d %3d %3d %3d  |  %3d\n",
                    idx++, row[0], row[1], row[2], row[3], row[4], rsum);
        }
        if (rtn == EOF) break;      /* if EOF, break outer loop */
    }

查看代码,全局范围内的enum只是提供了一种方法来声明通过代码的其余部分使用的多个常量。外部for (;;)循环只是循环直到它被破坏。在外部循环中,值'n'设置为NROW20),while循环最多执行n次或直到{{ 1}}无法阅读fscanfNCOL)个值或遇到5。虽然EOF循环会在while上中断,但这不会破坏外循环,因此在EOF中捕获fscanf的返回并在{{{{}}之后进行检查1}}循环退出。如果rtnwhile,则外循环退出。

这是将 marketing.txt 细分为20行组的一种基本方法。其余部分存储所需的总和,以便可以计算20行小计以及文件总数。虽然有多种方法可以执行此操作,但您知道每个rtn以及每个EOF的总计需要1个。只需读取每行中的5个值即可提供行总和的值。如果你只是考虑块范围并为每个代码块保留每个代码的总数(例如column之间每个循环的代码块),那么你就得到了值,你需要的小计和总数。

要记住的另一件事是重置(或归零)每次20行行重复时保留的每组值的值。只需声明相关变量并在每个单独块的开头初始化为row即可。

将各个部分放在一起,使用{ ... }作为文件总计列和行总和,0表示行索引,tsum表示20行行和列总计和读数将每行的值放入idx数组(以及几个简单的计数器变量),您可以执行类似以下操作:

csum

marketing.txt 作为第一个参数(或只是将内容重定向到row),代码将读取并对20行组中的行值求和,然后给出文件总数,例如

示例使用/输出

#include <stdio.h>

enum { NCOL = 5, NSUM, NROW = 20, MAXC = 256 };

int main (int argc, char **argv) {

    char buf[MAXC] = "";
    int idx = 0, tsum[NSUM] = {0};  /* row index, total sum */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    fgets (buf, MAXC, fp);       /* read/discard first line w/25  */

    for (;;) {                  /* for all 20 line blocks in file */
        int row[NCOL] = {0},                    /* row values     */
            csum[NSUM] = {0},                   /* col & row sums */
            i, n = NROW, rtn = 0, beg = idx;
        /* for each line in 20 line block, read values int row */
        while (n-- && (rtn = fscanf (fp, " %d %d %d %d %d", &row[0], &row[1],
            &row[2], &row[3], &row[4])) == NCOL && rtn != EOF) {
            int rsum = 0;
            for (i = 0; i < NCOL; i++) { /* for each value in row */
                rsum += row[i];          /* compute row sum */
                csum[i] += row[i];       /* 20 line col sum */
                tsum[i] += row[i];       /* total col sum   */
            } /* output row values | row sum */
            printf (" row [%3d]     %3d %3d %3d %3d %3d  |  %3d\n",
                    idx++, row[0], row[1], row[2], row[3], row[4], rsum);
            csum[NCOL] += rsum;     /* 20 line row sum sub-total */
            tsum[NCOL] += rsum;     /* file row sum total */
        }
        if (rtn == EOF) break;      /* if EOF, break outer loop */

        printf ("-------------------------------------\n"); /* 20 ln sub-total */
        printf (" rows[%3d-%3d] %3d %3d %3d %3d %3d  |  %3d\n\n", beg, idx - 1,
                csum[0], csum[1], csum[2], csum[3], csum[4], csum[NCOL]);
    }
    printf ("=====================================\n");    /* file totals */
    printf ("  total  %3d %3d %3d %3d %3d  |  %3d\n",
            tsum[0], tsum[1], tsum[2], tsum[3], tsum[4], tsum[NCOL]);

    if (fp != stdin) fclose (fp);     /* close file if not stdin */

    return 0;
}

看看结构,根据需要实现你的2D数组(因为你希望它分组20行,在stdin循环范围内声明它并初始化它将为每个组重置它)。如果您遇到问题,请告诉我。一开始可能看起来很多,如果你把它分解成碎片(线,组,文件等等)并从线(你接受输入)构建出来,它将有助于它落实到位。