2016-08-23 2 views
0

내가 fscanf 사용하여 파일에서 선을 읽으려고 오전() 읽기 :fscanf를 사용하여 라인()

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp; 
    char c, *string[4]; 
    int i = 0,j[4]; 
    fp = fopen("boil.txt", "r"); 
    c = fgetc(fp); 
    if(fp == NULL) 
    { printf("File read error\n"); 
     exit(0); 
    } 

    while(c != '\n') 
    { 
     fscanf(fp, "%s %d ", string[i] , &j[i]); 
     i++; 
     c = fgetc(fp); 
    } 
    for(i = 0; i < 4; i++) 
    { 
     printf("%s  %d\n", string[i], j[i]); 
    } 
} 

boil.txt은 다음과 같이이다 :

boil 4 boilmilk 3 boilwater 5 heat 10 

이 프로그램이 왜 분할 오류를 제공합니까?

+6

당신은 메모리를 할당 할 필요가에서 무료로 전화하는 것을 잊지 마세요 , 당신의'문자열 [내가]'포인터는 임의의 위치를 ​​가리 . –

+1

fgetc와 fscanf는 모두 파일 포인터를 앞쪽으로 이동하므로주의해야합니다. 원하는 문자를 가져 오지 못할 수도 있습니다. – crlanglois

+1

1) 오류 검사 2)'fgetc'은 좋은 이유로'char'가 아니라'int'를 반환합니다. 3) 할당 된 공간이 없습니다. 4) 등 5) [ask]를 보라. – Olaf

답변

5

당신은 문자열을위한 공간을 예약하지 않기 때문에 :

char *string[4]; 

문자열에 대한 포인터의 배열입니다,하지만 당신은 그 문자열을 저장하기 위해 같은 공간이 필요 :

char temp[256]; 

fscanf(fp, "%s %d ", temp , &j[i]); 
string[i] = strdup(temp); 

편집을 :

strdup을 사용할 수없는 경우 strdup은 표준에 포함되어 있지 않지만 (많은 구현에서 사용 가능) iRove에서 지적한 바와 같이 대체 방법은 다음과 같습니다.

string[i] = malloc(strlen(temp) + 1); 
if (string[i] == NULL) { 
    perror("malloc"); 
    exit(EXIT_FAILURE); 
} 
strcpy(string[i], temp); 

최종 (문자열이 경우 더 이상 필요)

for (i = 0; i < 4; i++) free(string[i]); 
+3

'strdup()'는 실제로 ISO C 표준의 일부가 아니라는 점을 명심해야합니다. – iRove

+1

iRove : 좋은 지적, 편집 됨. –

+1

그 점을 고려해 주셔서 감사합니다. :-) – iRove

관련 문제