2009-05-04 99 views
1

我有一個文本文件,我想以逐行讀取,並把該行到一個數組。C:讀取文件到一個數組

的片段背後給了錯誤,而編譯:

FILE *f; 
char line[LINE_SIZE]; 
char *lines; 
int num_righe; 

f = fopen("spese.dat", "r"); 

if(f == NULL) { 
    f = fopen("spese.dat", "w"); 
} 

while(fgets(line, LINE_SIZE, f)) {  
    num_righe++; 
    lines = realloc(lines, (sizeof(char)*LINE_SIZE)*num_righe); 
    strcpy(lines[num_righe-1], line); 
} 

fclose(f); 

的錯誤是:

spese.c:29: warning: assignment makes integer from pointer without a cast 
spese.c:30: warning: incompatible implicit declaration of built-in function ‘strcpy’ 
spese.c:30: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast 

任何幫助嗎? 感謝

+0

你真的應該包含頭文件的#include 到你的程序。很好,你還沒有做過-fno-builtin,在這種情況下,它不會警告你,程序會默默地被gcc編譯。 – 2009-05-04 19:41:28

+0

我是持懷疑態度的,如果的fopen的值( 「spese.dat」, 「W」)(F!);部分。如果這種情況發生,f打開寫入,並且fgets()不能成功。另外,更多的錯誤檢查在整個過程中都是一件好事,特別是realloc(),在不釋放舊緩衝區的情況下,它會在失敗時返回NULL。 – RBerteig 2009-05-05 00:53:46

+0

@Rerteig。我同意,錯誤檢查遠沒有出現。 – Tom 2009-05-05 02:05:34

回答

5

嘗試:

FILE *f; 
char line[LINE_SIZE]; 
char **lines = NULL; 
int num_righe = 0; 

f = fopen("spese.dat", "r"); 

if(f == NULL) { 
     f = fopen("spese.dat", "w"); 
} 

while(fgets(line, LINE_SIZE, f)) {    
     num_righe++; 
     lines = (char**)realloc(lines, sizeof(char*)*num_righe); 
     lines[num_righe-1] = strdup(line); 
} 

fclose(f); 
2

我拿這一小段代碼片段,因此,我想,你是alredy包括string.h中

strcpy的定義爲:

char * strcpy (char * destination, const char * source); 

strcpy(lines[num_righe-1], line); 

線[num_righe-1]是一個char,而不是一個char *

所以SHO這是

strcpy(lines + (num_righe-1), line); 

正如華麗的寫道,它看起來像你試圖使行數組的字符串。如果是這樣,你對行的定義是錯誤的。

而且,不要忘記,你應該檢查的realloc不返回NULL。

lines = realloc(lines, (sizeof(char)*LINE_SIZE)*num_righe); 

if (!lines) //MUST HANDLE NULL POINTER!! 

/* string copy code here*/ 
1

lines是指向字符的指針,即單個字符串。你希望它是一個字符串數組。爲此,它應該是char **lines;

1

可以使用的fscanf而不是做你想做的。

fscanf(f, "%s\n", line[index]); 
index++;