2012-03-13 2 views
2

Моего текстового файла отформатированный так:Получение слова из текстового файла в массив

my.txt 
Red 
Green 
Blue 
Yellow 

Я Тринг, чтобы получить слова так:

typedef char * string; 
main(){ 
    int i; 
    string array[4]; 

    FILE *my; 
    my = fopen("my.txt","r"); 
    for(i = 0; i < 4; i++) 
     fscanf(data, "%s", &array[i]); 
    fclose(my); 
} 

Когда я пытаюсь напечатать массив есть ошибка. Что не так с моим кодом и как я могу его исправить?

ответ

1

Вы пытаетесь прочитать некоторые данные, но не где-нибудь, чтобы положить его. Все, что у вас есть, - это 4 указателя, указывающие на то, что бог знает, где и вы пытаетесь написать в него!

Есть много способов сделать это:

  1. Вы знаете, связанный с размером данных:

    #include <stdio.h> 
    
    #define MAX_CHARS 20 
    
    typedef char string[MAX_CHARS+1]; // leave one space for '\0' 
    
    main(){ 
        int i; 
        string array[4]; 
    
        FILE *my; 
        my = fopen("my.txt","r"); 
        for(i = 0; i < 4; i++) 
         fscanf(data, "%s", array[i]); // no need for & with %s 
        fclose(my); 
    } 
    
  2. Предположим, связанный с размером данных, и игнорируемых остальные строки (если он был слишком велик):

    #include <stdio.h> 
    
    #define MAX_CHARS 20 
    #define MAX_CHARS_STR "20" // there are better ways to get this 
    
    typedef char string[MAX_CHARS+1]; 
    
    main(){ 
        int i; 
        string array[4]; 
    
        FILE *my; 
        my = fopen("my.txt","r"); 
        for(i = 0; i < 4; i++){ 
         fscanf(data, "%"MAX_CHARS_STR"s", &array[i]); // read at most 20 chars for the string 
         ungetc('x', data);  // append one character to make sure we don't hit space 
         fscanf(data, "%*s"); // ignore whatever is left of string 
        } 
        fclose(my); 
    } 
    
  3. Прочитайте файл дважды, сначала выясните размеры каждой строки (или максимального размера, для простоты), затем выделите память для строк (используя malloc).Затем прочитать файл снова и на этот раз на самом деле хранить строки:

    #include <stdio.h> 
    
    typedef char *string; 
    
    main(){ 
        int i; 
        string array[4]; 
        int cur_size = 0; 
    
        FILE *my; 
        my = fopen("my.txt","r"); 
        for(i = 0; i < 4; i++){ 
         fscanf(data, "%*s%n", &cur_size); 
         array[i] = malloc((cur_size+1)*sizeof(*array[i])); 
        } 
        fclose(my); 
    
        my = fopen("my.txt","r"); 
        for(i = 0; i < 4; i++){ 
         fscanf(data, "%s", array[i]); 
        } 
        fclose(my); 
    
        // and when done: 
        for(i = 0; i < 4; i++){ 
         free(array[i]); 
        } 
    } 
    
  4. Чтение из входного фрагмента с помощью куска. Для каждой строки, если строка ввода не была закончена, измените размер выделенной для строки памяти (увеличьте ее размер), прочитайте еще один фрагмент и снова проверьте. Метод 3 быстрее, хотя я рекомендую его, но так, как вы знаете, это в основном то, что происходит в C++ string.

2

Вам потребуется выделить память для строк с нулевым завершением.

На данный момент вы только выделения памяти для 4 char *, но эти указатели являются неинициализированным и для этого приведет к UB (неопределенное поведение) при попытке записать данные в памяти, на которую указывает им.


Рабочий пример фрагмент кода

Использование «% 127s» в приведенном ниже фрагменте кода, чтобы помешать нам писать за пределы выделенной памяти. С форматированной строкой, о которой идет речь, мы будем в наибольшей мере читать/записывать 127 байтов + нуль-терминатор.

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

  • Проверьте, что file_handle действительно действует после того, как попытка открыть файл
  • Проверьте, чтобы увидеть, что malloc действительно выделяют просил модуля памяти
  • Проверьте, чтобы fscanf прочитать нужный вход

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

int 
main (int argc, char *argv[]) 
{ 
    int i; 
    char * lines[4]; 
    FILE *file_handle = fopen ("my.txt", "r"); 

    for (i =0; i < 4; ++i) { 
    lines[i] = malloc (128); /* allocate a memory slot of 128 chars */ 
    fscanf (file_handle, "%127s", lines[i]); 
    } 

    for (i =0; i < 4; ++i) 
    printf ("%d: %s\n", i, lines[i]); 

    for (i =0; i < 4; ++i) 
    free (lines[i]); /* remember to deallocated the memory allocated */ 

    return 0; 
} 

выпуск

0: Red 
1: Green 
2: Blue 
3: Yellow 
+0

ошибка сегментации в 'fscanf (file_handle,"% 127s ", lines [i]);' –

1

Поскольку все остальные ответы сказали вам, что вы сделали неправильно, но не как это исправить. Здесь

typedef char * string; 
#define LEN 100 //long enough for your line 
main(){ 
    int i; 
    string array[4]; 

    for(i = 0; i < 4; i++) { 
     if((array[i] = (char *)(malloc(sizeof(char) * LEN))) == NULL) { 
      printf("malloc failed"); 
      return 1; 
     } 
    } 

    FILE *my; 
    my = fopen("my.txt","r"); 
    for(i = 0; i < 4; i++) 
     fscanf(data, "%s", &array[i]); 
    fclose(my); 
} 

И, как они сказали, вы сделали место для указателей, но не для указателей.

Смежные вопросы