2012-10-01 7 views
1

문자 파일을 64 자의 배열로 읽으려고합니다. 나는 독방 감금 오류가 계속데이터 파일을 읽을 때 세그먼트 화 오류가 발생했습니다.

int main (int argc, char **argv) 
{ 
    FILE *fp; 
    char write_msg[BUFFER_SIZE]; 

    fp = fopen("test.data", "r"); 

    int i; 
    for (i = 0; i < (BUFFER_SIZE-1); i++){ 
     fscanf(fp, "%s\n", &write_msg[i]); 
     printf ("printing in the for loop"); 
    } 
    fclose(fp); 
    printf("Starting the main().\n"); 
    printf("in Reader, the msg is: %s\n",write_msg); 

    pid_t pid; 
    int fd[2]; 

main()에서 파일 읽기이 발생하고 난 fscanf(fp, "%c\n", &write_msg[i]);해야

+0

for 루프의 printf에 개행을 추가하여 버퍼되지 않도록하십시오. 세고 폴트까지 얼마나 멀리 떨어져 있니? – Dan

+0

문제 # 1 : "fopen()"오류가 확인되지 않았습니다. 문제 # 2 : "BUFFER_SIZE"는 무엇이며, "fscanf (write_msg [BUFFER_SIZE])"가 그것을 초과하지 않을 것이라고 확신하십니까? 문제 # 3 : 루프에서 정확히 무엇을 달성하려고합니까? 캐릭터를 읽으시겠습니까? 문자열을 읽으시겠습니까? 줄을 읽으시겠습니까? 읽는 것을 어떻게 통제하고 있습니까? 솔직히 당신의 논리를 다시 생각할 필요가 있다고 생각합니다. 이모 ... – paulsm4

+0

줄을 배열로 읽으려고합니다. –

답변

1

fscanf(fp, "%s\n", &write_msg[i]);을 뭐하는 거지 확실하지 않다, 당신은 문자로 문자열을 스캔하고 싶지 않아요.

그리고 write_msg해야 '\ 0'로 끝이 난 당신의 코드에서 다음과 같은 문제를 참조

0

write_msg[BUFFER_SIZE-1]=0 :

fscanf(fp, "%s\n", &write_msg[i]); 

당신은 내가 즉 위치에서 시작하는 문자열을 읽는 시도를 루프 안에서 움직입니다. write_msg 문자열에 예약 된 메모리의 끝에 도달 할 때 세그먼트 화 오류를 얻는 것은 매우 쉽습니다.

또 다른 추천 : 당신의 FP 설명에 검증을 넣어 : 어떤 이유로 파일을 읽을 수없는 경우

fp = fopen("test.data", "r"); 
if (fp == NULL) { 
    /* Show an error and exit */ 
} 

, FP는 NULL 및 세그먼트 오류로 제기 될 수있을 것이다.

0

읽는 문자의 수를 제한하지 않고 오히려 길 수있는 문자열을 버퍼로 스캔합니다. 너는 그렇게해서는 안된다. 문자열이 훨씬 더 길더라도 i을 1 씩 증가시킵니다. 실제로는 fscanf의 특수 기능이 필요하지 않으므로 fgets 또는 fread을 사용하여 전체 파일을 버퍼로 읽어야하며 이러한 함수는 길이가 문자를 읽어야합니다. 또는 for 루프가 정말 마음에 드는 경우 fgetc을 사용할 수 있습니다. fscanf과 똑같습니다.

관련 문제