2015-10-10 2 views
-1

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

Мой текстовый файл выглядит следующим образом: AH12M8 N \ п AD34FU O \ п APD83H O \ п LKFU29 N \ п

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(int argc, const char * argv[]) 
{ 
    FILE *myfile; 
    myfile = fopen("Test.txt", "r"); 
    char *numWords; 
    long n = strtol(argv[1], &numWords, 10); 

    if(argc != 2) 
    { 
     printf("Too Few Arguments"); 
    } 
    else 
    { 
     char arr[n][100]; 
     int i = 0; 
     while(fgets(arr[i],sizeof(arr),myfile)!=NULL) 
     { 
      arr[i][strlen(arr[i])-1] = '\0'; 
      i++; 
     } 
     int total = i; 
     for(i = 0; i < total; ++i) 
     { 
      printf("%s\n", arr[i]); 
     } 
     fclose(myfile); 
    } 
    return 0; 
} 
+0

Одна проблема заключается в том, что вы проверяете наличие достаточных аргументов * после * вы используете argv [1]. –

+0

Где находится 'frame'? –

+0

"char arr [n] [100];" это неправильный способ выделения памяти. вам следует динамически распределять память с помощью malloc или calloc. –

ответ

0

Одна из проблем заключается в том, что вы выделяете пространство только для строк n, но затем вы читаете весь файл - так что если есть больше, чем n строк, вы запускаете конец вашего массива и коррумпируете память и, вероятно, сбой. Другая проблема заключается в том, что вы даете fgets длину массива ENTIRE, а не длину одной строки, поэтому, если любые строки длиннее 99 символов, вы бежите в следующую строку (или с конца и сбой). Закрепление обе проблемы относительно легко:

char arr[n][100]; 
    int i = 0; 
    while(i < n && fgets(arr[i], sizeof(arr[i]), myfile) != NULL) 
    { 
     if (arr[i][strlen(arr[i])-1) == '\n') 
      arr[i][strlen(arr[i])-1] = '\0'; 
     i++; 
    } 

Я также изменил его только падение последнего символа, если это символ новой строки - если у вас есть какие-либо входные линии длиной более 99 символов, они будут разделены на несколько строк ,

+0

Thank You I have пытался понять это долгое время. – IronCode

0
while(fscanf(myfile,"%[^\n]%*c",arr[i])==1)  
    { 
     arr[i][strlen(arr[i])-1] = '\0'; 
     i++; 
    } 

и проверить значение argc перед использованием argv[1].

+0

Весь список по-прежнему печатает даже после внесения этих изменений:/ – IronCode

+0

@IronCode. Я не понимаю, что вы подразумеваете под этим. Вы хотите распечатать эту строку за строкой? – ameyCU

+0

Так что, если мой список имеет 3 строки отделенные друг от друга \ п, например: ADM8U N \ п FJ29JD O \ п AL9UJ2 N \ п 38HDS1 N \ п Я только хочу, чтобы массив провести первые два, я хотел бы ввести 2 в качестве аргумента. – IronCode