C语言,文件加载到2D数组中

时间:2014-08-17 17:35:26

标签: c

我无法将文本文件中的字母加载到2D数组中。

我的代码如下;;

#include <stdio.h>

int main() {
    int i, j, a, b;
    char c;
    char f, filename[100];
    char match[i][j];
    FILE *fp;

    fp = fopen(filename, "r");
    for (a = 0; a < i; a++) {
        for (b = 0; b < j; b++) {
            match[i][j] = '.';
        }
    }

    while ((c = fgetc(fp)) != EOF) {
        for (a = 0; a < i; a++) {
            for (b = 0; b < j; b++)
                if ((c != '\n') && (c != '\r'))
                    match[a][b] = c;
        }
    }

    for (a = 0; a < i; a++) {
        for (b = 0; b < j; b++)
            printf("%c", match[a][b]);
        printf("\n");
    }

    return 0;
}

和文本文件包含如下字母:
AAAAA\nBBBBB\nCCCCC\nDDDDD\nEEEEF\n

我想加载文本文件到程序完全相同,但它只显示结果 喜欢: FFFFF\nFFFFF\nFFFFF\nFFFFF\nFFFFF\n

你能告诉我问题出在哪里吗?

2 个答案:

答案 0 :(得分:2)

  1. char match[i][j]这给出了编译错误,使用常量
  2. 定义数组
  3. scanf("%d%d%s", &i,&j,&filename);此处代替&amp; filename写入文件名,因为数组名称是数组的地址,不需要&
  4. 输入文件名时,请确保在此处输入完整地址"c:\\documents\\filename.txt"注意\或使用可以将其写为"c:/documents/filename.txt"

答案 1 :(得分:1)

正如Ahmed所说,你从未在显示的代码中初始化i,j和filename。

假设你这样做(使用你的输入,我假设i = 5,j = 5),你首先将所有match数组初始化为.:ok。

然后你逐个字符地阅读你的文件,并且控制它与&#39; \ n&#39;和\r。让我们来看看最后一个单词的最后一个字符发生了什么,即F。你在完整数组上循环(a [0; i [,b in [0; j [),如果字符,如果\r\n(不是)你影响它匹配[i,j]

for (a = 0; a < i; a++) {
    for (b = 0; b < j; b++)
        if ((c != '\n') && (c != '\r'))
            match[a][b] = c;
}

所以在循环结束时,匹配只包含F,这解释了当前的输出......

您还有另一个问题,即影响char c = fgetc(fp),并将其与EOF进行比较。这很危险,因为fgetc()和EOF都被声明为int

fgetc循环应位于最内部位置才能正常工作,只能跳过&#39; \ n&#39;和\r

int c; 
...
for (a = 0; a < i; a++) {
    for (b = 0; b < j; b++)
        while(((c = fgetc(fp)) != EOF) && ((c == '\n') || (c == '\r'))) /* skip eol /*
            if (c != EOF) 
                match[a][b] = c;
}

这应该足以解决当前的错误,但无论如何一般的程序组织都很糟糕。如果您是初学者,请将编码前的编码写为伪代码。在算法和结构良好之前,代码会很糟糕......