2009-10-25 2 views
1

C에서 fgetc 함수로 파일에서 한 줄을 읽으면 스택 오버플로가있을 수 있습니다. 일부는 특정 파일의 한 행에 ASCII 데이터의 거대한 행을 출력하는 프로그램을 작성했다고 가정합니다. C 프로그램의 해당 데이터를 화면에 표시하려면 어떻게해야합니까? 한 번에 100 자까지만 읽을 수는 있지만 특정 위치에서 어떻게 읽기 시작할 수 있는지 알지 못합니다.C로 긴 ASCII 파일 읽기

답변

1

read() 함수를 사용하여 한 번에 한 세트 크기 (예 : 100 바이트)로 읽을 수 있습니다. read()가 읽는 것이 아무것도 없음을 나타낼 때까지 계속 반복하면됩니다. read()는 읽은 바이트 수를 반환하므로 요청한 바이트 수보다 작은 바이트를 반환하면 완료되었음을 알 수 있습니다.

+1

당신이 FREAD 뜻을? –

+0

fread()는 특정 위치에서 읽을 수 있습니까? 아니! –

+0

Fread를 사용하면 특정 위치에서 읽을 수 있습니다. fread()는 항상 파일의 '현재 위치'에서 읽습니다 (특정이며 fseek로 수정할 수 있음). –

0

fseek() 및 ftell()에 문의하십시오.

1

는 전체 파일의 mmap mmap()

을보고 당신은 당신이 배열로 전체 파일을 읽을 경우와 같이 결과를 처리 할 수 ​​있습니다. 메모리를 할당하지 않아도된다는 보너스가 있습니다.

날을 downvoted 누구든지, 정말 & 읽기를 추구 이유 당신의 설명은 동적으로 malloc()를 사용하여 문자의 배열을 할당 할 수 있습니다이

+0

나는 투표를하지 않았지만 제 의견은 일반적인 문제 수업을 해결하지 않는다는 것입니다. 이 특정 경우에는 작동하지만 소켓, 외부 장치 등과 같은 문제는 정확히 동일하지 않습니다. 작전 중 상대적인 경험이없는 것으로 보이는 것을 감안할 때, 준비가되어 있지 않으면 그를 혼란에 빠뜨릴 수있는 일을 제안하는 것보다 모범 사례를 가르치는 것이 낫습니다. – Duck

1

에 대한 mmap를보다 더보고 싶어요, 다음 파일의 문자를 읽어 fgetc()를 사용하여 문자로. 버퍼의 끝에 도달하면 realloc()을 호출하여 버퍼를 확장 한 다음 계속 문자를 읽습니다. 이렇게하면 유일한 오류는 "메모리 부족"오류입니다.

char *buffer = malloc(200); 
unsigned int buffer_size = 200; 
unsigned int current = 0; 
char read; 

do 
{ 
    read = fgetc(stream); 
    if (current >= buffer_size - 1) 
    { 
     buffer_size += 200; 
     buffer = realloc(buffer, buffer_size); 
    } 
    buffer[current++] = read; 
} 
while (read != '\n'); 
buffer[current++] = '\0'; 

(위의 코드에서 누락 : 메모리 부족 조건 처리 realloc과의 리턴 값을 확인)) (