2009-05-04 37 views
1

私はテキストファイルを持っています。私はそれを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 

任意のヘルプ?

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

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

: おかげ

+0

あなたが本当にあなたのプログラムにヘッダーの#include を含める必要があります。あなたがしなかったことは良いことです。-fno-builtinは、あなたに警告することができず、プログラムはgccによって静かにコンパイルされていました。 –

+0

私はif(!f)fopen( "spese.dat"、 "w")の値について疑いを持っています。部。この状態が発生した場合、fは書き込みのためにオープンされ、fgets()は成功できません。また、特に古いバッファを解放せずに失敗した場合にNULLを返すrealloc()の場合、もう少し多くのエラーチェックが良いことです。 @RBerteig。 – RBerteig

+0

私は同意する、エラーチェックは現在から遠いです。 – Tom

答えて

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); 
+0

はsizeof(char)と常に1バイトは同じではありませんか? – Tom

+0

はい。しかし、私のコードはsizeof(char *)を使用しています。一般的に1ではなく4バイトです。 –

+0

ああ、気づかなかった*。謝罪します。 – Tom

2

私は結果的に、私はあなたがalredy string.hの

strcpyのは次のように定義されるなど、されていることを推測、これはコードsnipetで取ります行[num_righe-1]はcharであり、charではありません*

uld be

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

munificentが書いているように、行を文字列の配列にしようとしているようです。もしそうなら、あなたの行の定義は間違っています。

また、reallocがNULLを返さないことを確認する必要があります。

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

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

/* string copy code here*/ 
+0

これらのステートメントは同一ではありませんか? – samoz

+1

番号行[num_righe-1]はcharであり、行+(num_righe-1)は同じcharへのポインタです。 &lines [num_right-1]を使用することもできます。 –

+0

reallocを使用するときにキャストする必要はありません。 –

1

linesは、文字、つまり単一の文字列へのポインタです。あなたはそれを文字列の配列にします。そのためには、char **lines;

1

あなたが望むように代わりにfscanfを使うことができます。

fscanf(f, "%s\n", line[index]); 
index++; 
関連する問題