2011-05-03 2 views
3

4096 바이트보다 큰 입력 스트림을 받아 들여야하는 작은 C 프로그램을 작성하고 있습니다.STDIN 스트림에서 setvbuf() 사용

여기)을 setvbuf를 (사용 권장 게시물을 발견했다 :

Making fgets issue longer read() calls on linux

난 아직이 작업을 점점 정말 힘든 시간을 보내고있어 - 여기 내 코드의 비트의 그 I 고민 중입니다 :

int main(void) 
{ 
#define MAX_STRING_SIZE 7168 

char input_string[MAX_STRING_SIZE]; 

printf("Input: "); 

setvbuf(stdin, NULL, _IONBF, 0); 

fgets(input_string, MAX_STRING_SIZE-1, stdin); 

printf("\n"); 
printf("%s", input_string); 
} 

아무도이 입력 버퍼를 증가시키지 않았습니까?

내 환경 : 빌드 - 필수 패키지

감사와 우분투 10.10!

+2

'fgets()'대신'fread()'를 사용하면 어떨까요? –

+0

난 그냥 fread() 시도했지만 같은 문제가있는 것 같다. 입력을 요구할 때 터미널 창에 4096 바이트 만 붙여 넣을 수 있습니다. – Nate

+1

그래서 응용 프로그램에서 데이터를 터미널에 "붙여 넣어야"합니까? 파일 리디렉션'<'연산이 사용되면'fread()'와'fgets()'조차도 괜찮을 것입니다. 물론 캐릭터별로 데이터를 읽을 수 있습니다. 확실히 작동해야합니다. –

답변

4

지금은 _IONBF을 사용하고 있습니다. 즉, 버퍼링을 의미합니다. 대신 _IOFBF을 사용하면 좋은 시작이 될 것입니다 (즉, 전체 버퍼링).

setvbuf(stdin, NULL, _IOFBF, 16384); 

이 동적 버퍼 공간을 할당 : 버퍼 크기를 늘리려면, 당신은 또한 네 번째 매개 변수로 그 큰 버퍼 크기, 같은 것을 지정할 수 있습니다. 상황에 따라, 대신 그것을 버퍼를 통과 할 수 있습니다 :

char mybuffer[32768]; 

setvbuf(stdin, mybuffer, _IOFBF, sizeof(mybuffer)); 
+0

흠 - 나는 그 줄을 다음과 같이 변경했다. "setvbuf (stdin, NULL, _IOFBF, 16384);" 하지만 여전히 4,096에 하드 한도가있는 것 같습니다. 이 작은 코드는 입력을 요구하고 있으며 단순히 터미널 창에 4,261 자의 문자열을 붙여 넣으려고합니다. 문자열은 여전히 ​​4,096 번 마커에서 잘립니다. – Nate

+2

@ 네이트 : 추측 해 보면, 그것은 무관합니다. 그것은 당신이 터미널 윈도우의 라인 편집기에 내장 된 버퍼 제한에 부딪치고있는 것처럼 들립니다. 'setvbuf'는 표준 라이브러리에 내장 된 버퍼만을 변경합니다. 터미널에서 데이터를 읽을 때 터미널의 4096 바이트 버퍼에서 지정된 버퍼로 복사되지만 라이브러리의 데이터를 변경해도 터미널에 내장 된 on에는 영향을 미치지 않습니다. 터미널의 버퍼 크기를 변경할 수 있지만, 그렇다면 아마도 ioctl과 같은 것이 될 것입니다. –

+0

@ 제리 : 나는 약간의 완충기를 때리고 있다는 것을 알고 있지만, 나는 어느 것을 모른다는데 동의한다. (: 우분투 터미널 창에서 일반 명령 프롬프트에서 나는 4261 바이트 만 붙여 넣을 수있다. 내 C 프로그램을 실행할 때 입력을 요구하면 4096으로 제한된다. – Nate

3

나는 과거에 버퍼 크기와 실험, 그리고 증가에 작은 이익을 발견했다. fgets과 같은 더 높은 수준의 입력 함수 (또는 더 나쁜 경우 fgetc 또는 fscanf)를 사용하는 경우 구분자를 검색하거나 함수 호출 또는 구문 분석 오버 헤드를 검색하는 데 충분한 시간이 걸리므로 read 시스템 호출 수가 그다지 중요하지 않습니다. 버퍼가 적어도 1kb 정도라면. 반면에 한 번에 큰 블록을 읽는 경우 (fread 통해), 구현은 완전히 버퍼링을 건너 뛰고 호출자가 제공 한 버퍼로 직접 읽을 수있을만큼 똑똑해야합니다. 따라서 일반적으로 무의미한 마이크로 최적화라고해도 setvbuf을 쓸모없는 것으로 간주합니다.