파일 디스크립터에서 \n이 있는곳까지만 읽어들이는 함수를 만들려고 합니다.
근데, 막상 짤려고 하니까 꽤나 복잡하군요.
read()로 한바이트씩 읽어서 누적시키는 방법은 너무 느릴것 같고...
대략 어떤 방법으로 짜면 좋을까요?
fgets가 있습니다. fdopen으로 나온 파일 포인터를 이용하면 되지 않을까요?
P.S. 생각해보니... 일부러 만드는 건가 보네요. ^^;
바로 read 하지 않고 중간에 버퍼링을 하나 하도록 구현해서 한번에 많이 읽어온 후에 그 버퍼안에서 \n 을 찾는 방법을 많이 사용합니다.
한줄만 읽는 거라면.. 그 크기가 몇 만 바이트가 되거나 하는 등... 크지 않을 거라 생각할 수 있고 이런경우라면.. 한글자씩 읽는 방식을 택해도 무리 없을거 같은데요.
또다른 방법은 read로 읽어서 그 내부에서 \n를 찾는 방식...
다음으로 fileno()라는 함수를 사용해서 리턴한 포인터를 가지고 fgets를 사용하는 것
등등등.. 방법은 많은 것 같은데요.
Do you think that's the air you are breathing now?
std::getline()이 젤 편리하지요.
int main(int argc, char* argv[]) { using namespace std; ifstream fin(argv[1]); ofstream fout(argv[2]); string line, int i = 0; while(getline(fin, line)) { fout << "LINE " << ++i << ": "<< line << endl; } return 0; }
C 언어로, 표준 stream IO를 쓰지 않는다고 가정하고 설명합니다.
stat(2)을 써서 st_blksize를 읽어, 주어진 file descriptor가 가리키는 파일이 존재하는 file system buffer size를 읽어와서 그 크기만큼 버퍼#1를 잡고 read(2)를 써서 그 버퍼#1를 채웁니다.
이렇게 준비한 버퍼#1에서 한 글자씩을 읽어서 ('\n'이 나올때까지) 이 것을 다른 버퍼#2에 저장합니다. 이러한 목적으로 쓰는 버퍼는 GNU obstack을 쓰면 편리하고 매우 빠릅니다.
다음 이 버퍼#2의 내용을 다른 곳에 복사하거나, 안전할 경우, 이 버퍼의 포인터를 리턴하면 됩니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html Korean Ver: http://cinsk.github.io/cfaqs/
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
fgets가 있습니다. fdopen으로 나온 파일 포인터를 이용하면 되지
fgets가 있습니다. fdopen으로 나온 파일 포인터를 이용하면 되지 않을까요?
P.S. 생각해보니... 일부러 만드는 건가 보네요. ^^;
바로 read 하지 않고 중간에 버퍼링을 하나 하도록 구현해서 한번에 많
바로 read 하지 않고 중간에 버퍼링을 하나 하도록 구현해서 한번에 많이 읽어온 후에 그 버퍼안에서 \n 을 찾는 방법을 많이 사용합니다.
한줄만 읽는 거라면.. 그 크기가 몇 만 바이트가 되거나 하는 등...
한줄만 읽는 거라면.. 그 크기가 몇 만 바이트가 되거나 하는 등... 크지 않을 거라 생각할 수 있고
이런경우라면.. 한글자씩 읽는 방식을 택해도 무리 없을거 같은데요.
또다른 방법은 read로 읽어서 그 내부에서 \n를 찾는 방식...
다음으로 fileno()라는 함수를 사용해서 리턴한 포인터를 가지고 fgets를 사용하는 것
등등등.. 방법은 많은 것 같은데요.
Do you think that's the air you are breathing now?
C++이라면
std::getline()이 젤 편리하지요.
C 언어로, 표준 stream IO를 쓰지 않는다고 가정하고 설명합니다.
C 언어로, 표준 stream IO를 쓰지 않는다고 가정하고 설명합니다.
stat(2)을 써서 st_blksize를 읽어, 주어진 file descriptor가 가리키는 파일이 존재하는 file system buffer size를 읽어와서 그 크기만큼 버퍼#1를 잡고 read(2)를 써서 그 버퍼#1를 채웁니다.
이렇게 준비한 버퍼#1에서 한 글자씩을 읽어서 ('\n'이 나올때까지) 이 것을 다른 버퍼#2에 저장합니다. 이러한 목적으로 쓰는 버퍼는 GNU obstack을 쓰면 편리하고 매우 빠릅니다.
다음 이 버퍼#2의 내용을 다른 곳에 복사하거나, 안전할 경우, 이 버퍼의 포인터를 리턴하면 됩니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기