将文本文件的内容读入2 * 2数组的困难

时间:2012-03-17 08:57:43

标签: c pointers

我在将文本文件中的字符读入二维动态数组时遇到了一些困难 - 它在“Problem_03_life.exe中的0x011d155d处未处理的异常:0xC0000005:访问冲突写入位置0xfdfdfdfd”中失败。

这是一段代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

if(argc <= 1) printf("Program needs two arguments: input file and output file!");

FILE* f;
f = fopen(argv[1],"r");
if(f == NULL) printf("File cannot be opened!\n");


/* Determining how many lines and length of string */ 
int m = 0;
int n = 0;
char c;
while((c = fgetc(f))!=EOF) {
    if(c == '\n') {n++;}
    else m++;
}
m /= n; // counting quantity of chars in one line

/* here i'm allocating memory for array (am i right?) */ 
char** field = (char**)malloc(n*sizeof(char*));
for(int i = 0; i < n; i++) {
    *(field + i) = (char*)malloc(m*sizeof(char));
} 

int i = 0, j = 0;


for(i = 0; i <= n; i++){
    for(j = 0; j <= m; j++){
        *(*(field + i)+ j) = fgetc(f); // Here i get an error
    }
}

fclose(f);

}

这是一个文件的竞争(我也需要读取空格):

*************
* ##        *
*           *
* #         *
*************

使用ponters读取它时我做错了什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

您的代码存在多个问题:

  • 第二个是“一个太远”。将“&lt; =”更改为“&lt;”
  • 您依赖于每条线具有相同长度的事实。一旦不同的行具有不同的长度,您将遇到麻烦
  • 您使用char来存储fgetc的返回值。 fgetc返回int
  • 您在fgetc已经返回EOF后尝试致电fgetc。根据定义,它只能返回*(field + i)。您需要回放或考虑不同的策略

此外,你正在努力使它变得更难:

  • field[i]可以写成*(*(field + i)+ j)
  • field[i][j]可以写成{{1}}