2016-02-05 2 views
-1

Я пытаюсь читать слова из файла (который имеет по одному слову в строке) и хранить эти слова в массиве 2D String, так что каждая строка содержит все слова, начинающиеся с того же букв/символов. Но когда я пытаюсь распечатать массив, все элементы отображаются как «null».Как назначить слова из файла двумерному массиву строк в C

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <string.h> 
#define numberOfMappers 2 

char *buffer1[10]; 
char *buffer2[10]; 
int add = 0; 
int rem = 0; 
int num = 0; 

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t c_mapper = PTHREAD_COND_INITIALIZER; 
pthread_cond_t c_pooler = PTHREAD_COND_INITIALIZER; 

void *pooler (void *param); 
void *mapper (void *param); 
void printBuffer1(); 

int main(int argc, char *argv[]) { 
    pthread_t tid1; 
    int i; 
    if(pthread_create(&tid1, NULL, pooler, NULL) != 0) { 
     fprintf(stderr, "Unable to create producer thread\n"); 
     exit(1); 
    } 
    pthread_join(tid1, NULL); 
    printBuffer1(); 
    return 0; 
} 

void *pooler(void *param) { 
    FILE * fp; 
    char * line = NULL; 
    size_t len = 0; 
    ssize_t read; 
    fp = fopen("file.txt", "r"); 
    if (fp == NULL) 
    exit(EXIT_FAILURE); 
    int i; 
    for (i = 0; i < 10; i ++) { 
    buffer1[i] = line; 
    } 
    fflush(stdout); 
    return 0; 
} 

void printBuffer1() { 
    int i; 
    for (i = 0; i < 10; i ++) { 
    printf("%s\t", buffer1[i]); 
    } 
} 
+1

'символ * buffer1 [26] [100];' -> 'обугленного buffer1 [26] [100];' – Magisch

+0

' getline' уже завершает строку, поэтому вам не нужно это делать. Более серьезным является то, что 'getline' не выделяет новый буфер, если строка помещается в память, которую вы ему дали, чтобы вы завершили дублирование указателей. – molbdnilo

+0

У вас, вероятно, есть пустая строка в конце файла. Значение всех ваших строк равно «NULL» или этой пустой строке. 'line' ссылается на правильное слово при его сохранении, но его содержимое изменилось, когда вы читаете дальнейшие строки. Вы можете сделать копии строк с помощью 'strdup' следующим образом:' buffer1 [r] [c] = line; '(Когда вы печатаете строки для целей отладки, это хорошая идея, обернуть их в кавычки, чтобы вы могли обнаружить пустые строки и конечные пробелы.) –

ответ

0
  1. Вы забыли позвонить getline().
  2. getline() повторно использует или перераспределяет буфер строки, если вы проходите предыдущий, таким образом старая строка теряется. Это можно предотвратить, очистив указатель line перед каждым вызовом.

Итак, вставьте

line = NULL, len = 0; 
    if (getline(&line, &len, fp) < 0) break; 

перед тем

buffer1[i] = line; 
Смежные вопросы