2015-12-07 6 views
1

Я пытаюсь создать динамически выделенный массив с динамически выделенными строковыми элементами, используя getline().Динамически выделенный массив с динамически выделенными строковыми элементами, используя getline()

Это мой код,

char** getWordlist() 
{ 
    FILE* fp = fopen("Wordlist", "r"); 
    if(errno == ENOENT)     
     fp = fopen("Wordlist", "w+r"); 
    if(!fp) { 
     perror("Could not open wordlist"); 
    exit(EXIT_FAILURE); 
} 

int c, fileLines = 0; 
do{ 
    c = fgetc(fp); 
    if(c == '\n') 
     fileLines++; 
} while(c != EOF); 
rewind(fp); 


char** wordlist = calloc(fileLines, sizeof(char*)); 
for(c = 0; c < fileLines; c++) 
    getline(&wordlist[c], 0, fp); 

    printf("%s", (wordlist[0])); 

fclose(fp); 
return wordlist;  
} 

Однако printf печатает выходы (null), поэтому строки никогда не была создана, я думаю.

Что я делаю неправильно?

+1

Где ваш 'INT главный (...)'? – ryyker

+1

Почему '3' в' printf ("% s", (wordlist [3])); '? – chux

+1

Метод, используемый для определения 'fileLines', будет 1 коротким, если' Wordlist' не заканчивается '' \ n''. – chux

ответ

3

Некорректное использование getline()

Pass адрес size_t, а не 0.

for(c = 0; c < fileLines; c++) 
    // getline(&wordlist[c], 0, fp); 
    size_t size = 0; 
    getline(&wordlist[c], &size, fp); 

Чтобы устранить потенциал от -1 в строке счета расчета

int c; 
size_t fileLines = 0; 
int previous = '\n'; 
while ((c = fgetc(fp)) != EOF) { 
    if(previous == '\n') fileLines++; 
    previous = c; 
} 
+0

Это сработало, спасибо! – Eijomjo

0

относительно этой линии:

printf("%s", (wordlist[3])); 

Он пытается напечатать неправильную линию. и он не является частью цикла for(), который считывает строки из файла.

Предлагайте:

size_t lineLength = 0; 
for(int i = 0; i < fileLines; i++) 
{ 
    getline(&(wordlist[i]), &lineLength, fp); 
    printf("%s\n", wordlist[i]); 
} 
Смежные вопросы