Трудности чтения содержимого текстового файла в массив 2 * 2 - PullRequest
0 голосов
/ 17 марта 2012

Я столкнулся с некоторыми трудностями при чтении символов из текстового файла в двумерный динамический массив - он завершается с ошибкой «Необработанное исключение в 0x011d155d в Problem_03_life.exe: 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 Ответ

1 голос
/ 17 марта 2012

Существует несколько проблем с вашим кодом:

  • Второе значение идет "слишком далеко".Измените «<=» на «<» </strong>
  • Вы зависите от того факта, что каждая строка имеет одинаковую длину.Как только разные строки имеют разную длину, вы столкнетесь с проблемами
  • Вы используете символ для хранения возвращаемого значения fgetc.fgetc возвращает int
  • Вы пытаетесь позвонить fgetc после того, как он уже вернулся EOF.По определению он может вернуть только fgetc.Вам нужно перемотать или рассмотреть другую стратегию

Кроме того, вы делаете это сложнее, чем должно быть:

  • *(field + i) можно записать как field[i]
  • *(*(field + i)+ j) можно записать как field[i][j]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...