2009-05-04 4 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에 의해 조용히 컴파일되었을 것이다. –

+0

나는 if (! f) fopen ("spese.dat", "w")의 값에 대해 모호하다. 부품. 이 조건이 발생하면 f는 쓰기를 위해 열려 있고 fgets()는 성공할 수 없습니다. 또한 약간의 에러 검사가 전체적으로 좋을 것입니다. 특히 realloc()은 오래된 버퍼를 해제하지 않고 실패 할 경우 NULL을 반환합니다. – RBerteig

+0

@RBerteig. 나는 동의한다. 오류 검사는 현재와 거리가 멀다. – 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입니다 걸릴 :

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

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

에서 lines [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++;