从输入文件

时间:2017-02-18 05:27:00

标签: c file

我正在尝试通过C中的输入文件读取数组。我在显示数组后出现分段错误(核心转储)错误。任何人都可以解决这个问题。 这是我的c程序

#include <stdio.h>
#include<stdlib.h>
int main()
{
    int c, i, j, row, col, nl, cr,nt;
     col = nl = cr = nt=0;
    int k;
    row=1;
    FILE *fp = fopen("IO.txt", "r");
    // Figure out how many rows and columns the text file has
   while ((c = getc(fp)) != EOF)
    {
        if (c == '\n')
            nl++;
        if (c == '\r')
            cr++;
        if(c=='\t')
            nt++;
        col++;
        if (c == '\n')
            row++;
        putchar(c);
    }
    //row=row+1;
col = (col - (nl + cr+nt));
col = (int) (col/row); 
char **array = malloc(sizeof(char *) * row);

for(int k=0;k<row;k++) 
{
    array[c] = malloc(sizeof(char) * col);
}

if(fp)
{
    for( ;; )
    {
        c = getc(fp);
        if ( c == EOF )
        {
            break;
        }
        if ( c != '\n' && c != '\r' )
        {
            array[i][j] = c;
            if ( ++j >= col )
            {
                j = 0;
                if ( ++i >= row )
                {
                    break;
                }
            }
        }
    }
    fclose(fp);
}
for ( i = 0; i < row; i++ )
{
    for ( j = 0; j < col; j++ )
    {
        putchar( array[i][j]);
    }
    putchar('\n');
}
free(array);
array=NULL;
return 0;
}

这是我的输入文件

IO.txt

 0  0   0   0   0   0   0

 0  0   1   0   2   0   0

 0  1   0   4   3   6   0

 0  0   4   0   0   5   0

 0  2   3   0   0   7   8

 0  0   0   0   8   0   9

 0  0   0   0   8   9   0

1 个答案:

答案 0 :(得分:3)

在此代码中:

for(int k=0;k<row;k++){
    array[c] = malloc(sizeof(char) * col);
}

您应该使用k而不是c来访问arrayc完全是另一个变量。

您的编译器应该已经警告过您。始终注意警告:

io.c: In function ‘main’:
io.c:7:9: warning: unused variable ‘k’ [-Wunused-variable]
     int k;
         ^

此外,sizeof(char)明确为1,因此您永远不需要指定它。

所以循环应该如下所示:

for(int k=0;k<row;k++){
    array[k] = malloc(col);
}

此外,在释放array之前,您忘记释放array的元素。你应该这样做:

for (int k=0; k<row; k++){
    free(array[k]);
}

此外,您还没有正确计算列数。这段代码:

if(c=='\t')
    nt++;
col++;

每次循环都会增加col,因为col++不在if(c=='\t')范围内。你需要大括号:

if (c =='\t') {
    nt++;
    col++;
}

此外,在您第二次阅读之前,您已经忘记关闭然后重新打开文件,或者回头查看。 if(fp)没有为您做任何事情。你应该这样做:

/* Close and then reopen the file */
fclose(fp);
fp = fopen(fopen("IO.txt", "r"));

或者这个:

/* Seek to the beginning of the file */
fseek(fp, 0, SEEK_SET);

此外,您忘了将ij初始化为0。编译器不会为你做这件事,所以你需要:

int c, i = 0, j = 0, row, col, nl, cr, nt;

此外,您还没有正确计算列数或行数。通过回车计算行不是很可靠,因为在文件的最后一行可能没有回车符,但假设有,则row初始化为0,并且列计算是:

col = (col / row) + 1;

另外,当您第二次阅读文件时,您忘记检查选项卡。添加字符到数组的条件应该是:

if ( c != '\n' && c != '\r' && c != '\t')

这是所有的逻辑问题。其余的只是卫生和风格:检查文件是否成功打开,检查malloc()的结果等。