2010-07-07 4 views
5

stdin/stdout에서 데이터를 읽고 쓰는 다양한 방법을 찾고 있습니다. 현재 scanf/printf, getchar/putchar 및 gets/puts에 대해 알고 있습니다. 이 작업을 수행하는 다른 방법이 있습니까? 또한 나는 어느 것이 메모리와 공간면에서 가장 효율적인지를 아는 데있어서 흥미 롭다. 사전에C에서의 I/O 메소드

덕분에

+6

는 C 프로그래밍 언어로 책을 읽기에 대한 Curses (Windows에서 더 * 괜찬아 측면에 적용 할뿐만 아니라 가능) 잊지 마세요 즉시 모드 유형 물건을 찾고 있다면. 그리고 I/O 작업은 일반적으로 CPU 바운드가 아닙니다. –

답변

2

STDIO가 상당히 수 있도록 설계되었습니다 데이터를 읽는 방식에 관계없이 효율적입니다. 문자 단위의 읽기 및 쓰기가 필요한 경우에는 대개 전체/비어있을 때만 버퍼에 액세스하는 매크로로 확장됩니다. 줄 단위 텍스트 io의 경우 puts/fputsfgets을 사용하십시오. (하지만 의 경우 NEVERgets을 사용하기 때문에 읽을 바이트 수를 제어 할 방법이 없습니다! printf 패밀리 (예 : fprintf)는 쓰기 전에 메모리의 임시 버퍼를 건너 뛰는 것을 허용하므로 텍스트에 매우 유용합니다 따라서 모든 메모리 할당, 오버 플로우 등의 문제에 대해 생각하지 않도록 할 수 있습니다. fscanf은 사용하기가 어려우므로 대부분 덜 유용합니다. fscanf에 대한 문서를 잘 읽고 %[, %n 및 숫자 지정자를 사용하는 방법을 배우면 매우 강력 할 수 있습니다.

큰 텍스트 블록 (예 : 전체 파일을 메모리에로드) 또는 이진 데이터의 경우 freadfwrite 기능을 사용할 수도 있습니다. count 인수에는 항상 size 인수와 읽기/쓰기 바이트에 1을 전달해야합니다. 그렇지 않으면 반환 값에서 성공적으로 읽거나 쓸 수 있었던 값을 알 수 없습니다.

당신이 합리적으로 POSIX 계열 시스템 (꽤 많이 아무것도)에 있다면 당신은 또한 낮은 수준의 입출력 기능 open, read, write을 사용할 수 등이 있습니다 C 표준 그러나 일부의 NOT 부분 POSIX 시스템과 비 POSIX 시스템은 대개 동일한 기능을 제공하지만 약간 다른 동작을 할 수 있습니다 (예 : 파일 디스크립터는 POSIX처럼 순차적으로 0,1,2, ... 번호가 매겨지지 않음).