无法打印2d数组 - 文件输入

时间:2018-04-13 00:02:31

标签: c

也许这是一个非常简单的问题,但我很困惑

如果我的代码名为example.c并将txt文件作为输入,请说txt.txt。我在终端(linux)中运行命令./example txt.txt。 根据用户通过文件给我的内容,我创建了一个2D数组。 如果fie的背景是:

+X..XX....-
.X..X..X-..
.X.........
...XX......
XXX.+X.....
..X.....XXX
...XXX..X-.
.-.....X...

我计算行(在此示例中为1)和新行之前的元素,以查找我的数组的行。

请告诉我在将文件打印成二维数组时我做错了什么?

我无法正确打印数组。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
    int lines=0, rows=0, j, k;
    char ch, array[1000][1000];
    FILE *fin;

    if(argc!=2){
        exit(2);
    }

    fin=fopen(argv[1],"r");

    if(fin==NULL) {
        exit(2);
    }
    while(!feof(fin)){
        ch=fgetc(fin);
        if(ch=='\n') lines++;
    }

    fclose(fin);
    fin=fopen(argv[1],"r");

    while(!feof(fin)){
        ch=fgetc(fin);
        if(ch=='+' ||ch=='-'|| ch=='.'||ch=='X') rows++;
        if(ch=='\n') break;
    }

    printf("%d %d\n", lines, rows);
    fclose(fin);
    fin=fopen(argv[1],"r");

    while(!feof(fin)) {
        for(j=0; j<lines; j++){
            for(k=0; k<rows; k++){
                scanf(fin, "%c", &array[j][k]);
            }
        }

        //printf("%d %d", lines, rows);
        int i;
        for(i=0; i<lines; i++){
            for(j=0; j<rows; j++){
                printf("%c", array[i][j]);
                //printf("%d %d\n", i, j);

            }
        }
        fclose(fin);
        return 0;
    }
}

1 个答案:

答案 0 :(得分:3)

您的代码中有几个问题

  1. 请参阅why while(foef(file)) is always wrong。如果你要读 按字符划分的文件字符,最好这样做:

    int c;
    while((c = getchar()) != EOF)
    {
        // do somthing with c
    }
    
  2. 读取像fscanf(fin, "%c", &array[j][k]);这样的值可以,但是 它有一个问题:你忘记考虑换行了。你是 只读row个字符数,但整行(假设有 没有空格和制表符)有row+1个字符,换行符不会消失,所以 当你读完一行的最后一个值时,下一个scanf将会 读取下一个值,它会读取换行符。你可以通过这样做来解决它 这样:

    for(j=0; j<lines; j++){
        for(k=0; k<rows; k++){
            fscanf(fin, "%c", &array[j][k]);
    
        getchar(); // consume the newline
    }
    
  3. 通常,您应该使用fgets逐行读取值,然后使用 可以使用sscanf来解析该行。

    所以,确定行数:

    int lines = 0;
    int c, last = '\n';
    while((c = fgetc(fin)) != EOF)
    {
        last = c;
        if(c == '\n')
            lines++;
    }
    
    // in case the last line does not end with \n
    // some file editors don't end the last line with \n
    if(last != '\n')
        lines++;
    

    获取行数:

    int rows = 0; 
    while((c = fgetc(fin)) != EOF)
    {
        // based on your example, the file does not
        // contains other characters than +,-,.,X and newlines
        if(ch == '\n')
            break;
        else
            rows++;
    }
    

    现在要读取值:

    // assuming that the file has the correct format and that
    // all lines have the same length
    char line[rows+2];  // +2 because of the newline and the 0 terminating byte
    
    for(int i = 0; i < lines && i < 1000; ++i)
    {
        fgets(line, sizeof line, fin);
        char *tmp = line;
        for(int j = 0; j < rows && j < 1000; ++j)
            sscanf(tmp++, "%c", &array[i][j]);
    }
    

    请注意,此代码表示文件格式正确且所有行都有 相同的长度。为了使阅读更加健壮(这意味着它 你可以对格式错误做出反应)你需要检查fgets的返回值 sscanf。我为了简单起见省略了这一点,但你应该添加这些 检查。

    每次都不需要打开和关闭fin,您可以使用rewind(fin) 在开头设置文件。