2013-10-14 3 views
1

Код должен читать введенное пользователем текстовое имя файла, копировать каждый символ в многомерный массив, а затем отображать его со стандартным выходом. Он компилирует, но создает непонятный текст. Я что-то упускаю?чтение текстового файла, копирование в массив в C

for (i = 0; i < BIGGEST; i++) { 
     for (j = 0; j < BIGGESTL; j++) { 
      if (fgetc(array, fp)) != EOF) 
       array[i][j] = c; 
      else array[i][j] = '\0' 


     } 

    fclose(fp);  
    return 0; 
} 

ответ

2

Вы перестаете заполнять массив, когда сталкиваетесь с EOF, но вы печатаете полный массив вне зависимости от того, что.

Если данные, считанные из файла, меньше входного массива, вы будете считывать эти данные и распечатывать эти данные, а также любые случайные символы в ячейках памяти, которые вы не перезаписываете данными из файла ,

Поскольку требование состоит в том, чтобы печатать текстовые данные, вы можете вставить специальный маркер в массив (например, '\ 0'), чтобы указать положение, в котором вы столкнулись с EOF, и прекратить отображение данных, когда вы достигнете этого маркера.

+0

Также проверьте, что вы не превышает максимальный размер стека для вашей платформы и/или настройки компилятора. Вы выделяете почти 1 МБ памяти. Для VS размер стека по умолчанию составляет 1 МБ: http://stackoverflow.com/questions/1825964/c-c-maximum-stack-size-of-program –

0

Вы лучше прочитать каждую строку из файла

Например:

int i = 0; 
while(fgets(text[i],1000,fp)) 
{ 
    i++; 
} 
0

Хотя вопрос редактируется и только часть кода остается под вопросом. На данный момент я публикую больше, чем требуется для этого вопроса. Причина в том, что изначально опубликованного полного кода может быть много улучшений.

В main() функции:

Вы должны проверить значение argc равным 2 для вашей цели, и только затем прочитать в стоимости argv[1]. Если программа выполняется без аргумента командной строки, которая в этом случае является файловым именем, происходит неправильное считывание памяти, что приводит к ошибке сегментации, если вы читаете в argv[1].

В read_file_and_show_the contents() функции:

Остановить чтение файла, если конец файла достигнут или максимальное количество символов для чтения и хранения в массиве символов.

Ниже Программа поможет вам визуализировать:

#include <stdio.h> 

/*Max number of characters to be read/write from file*/ 
#define MAX_CHAR_FOR_FILE_OPERATION 1000000 

int read_and_show_the_file(char *filename) 
{ 
    FILE *fp; 
    char text[MAX_CHAR_FOR_FILE_OPERATION]; 
    int i; 

    fp = fopen(filename, "r"); 

    if(fp == NULL) 
    { 
     printf("File Pointer is invalid\n"); 
     return -1; 
    } 
    //Ensure array write starts from beginning 
    i = 0; 

    //Read over file contents until either EOF is reached or maximum characters is read and store in character array 
    while((fgets(&text[i++],sizeof(char)+1,fp) != NULL) && (i<MAX_CHAR_FOR_FILE_OPERATION)) ; 

    //Ensure array read starts from beginning 
    i = 0; 

    while((text[i] != '\0') && (i<MAX_CHAR_FOR_FILE_OPERATION)) 
    { 
     printf("%c",text[i++]); 
    } 

    fclose(fp); 

    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    if(argc != 2) 
    { 
     printf("Execute the program along with file name to be read and printed. \n\ 
       \rFormat : \"%s <file-name>\"\n",argv[0]); 
     return -1; 
    } 

    char *filename = argv[1]; 

    if((read_and_show_the_file(filename)) == 0) 
    { 
     printf("File Read and Print to stdout is successful\n"); 
    } 
    return 0; 
} 
Смежные вопросы