파일 디스크립터에서 한 줄만 읽어오는 함수

segfault의 이미지

파일 디스크립터에서 \n이 있는곳까지만 읽어들이는 함수를 만들려고 합니다.

근데, 막상 짤려고 하니까 꽤나 복잡하군요.

read()로 한바이트씩 읽어서 누적시키는 방법은 너무 느릴것 같고...

대략 어떤 방법으로 짜면 좋을까요?

맹고이의 이미지

fgets가 있습니다. fdopen으로 나온 파일 포인터를 이용하면 되지 않을까요?

P.S. 생각해보니... 일부러 만드는 건가 보네요. ^^;

bugiii의 이미지

바로 read 하지 않고 중간에 버퍼링을 하나 하도록 구현해서 한번에 많이 읽어온 후에 그 버퍼안에서 \n 을 찾는 방법을 많이 사용합니다.

운형의 이미지

한줄만 읽는 거라면.. 그 크기가 몇 만 바이트가 되거나 하는 등... 크지 않을 거라 생각할 수 있고
이런경우라면.. 한글자씩 읽는 방식을 택해도 무리 없을거 같은데요.

또다른 방법은 read로 읽어서 그 내부에서 \n를 찾는 방식...

다음으로 fileno()라는 함수를 사용해서 리턴한 포인터를 가지고 fgets를 사용하는 것

등등등.. 방법은 많은 것 같은데요.

Do you think that's the air you are breathing now?

cedar의 이미지

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; 
} 

cinsk의 이미지

C 언어로, 표준 stream IO를 쓰지 않는다고 가정하고 설명합니다.

stat(2)을 써서 st_blksize를 읽어, 주어진 file descriptor가 가리키는 파일이 존재하는 file system buffer size를 읽어와서 그 크기만큼 버퍼#1를 잡고 read(2)를 써서 그 버퍼#1를 채웁니다.

이렇게 준비한 버퍼#1에서 한 글자씩을 읽어서 ('\n'이 나올때까지) 이 것을 다른 버퍼#2에 저장합니다. 이러한 목적으로 쓰는 버퍼는 GNU obstack을 쓰면 편리하고 매우 빠릅니다.

다음 이 버퍼#2의 내용을 다른 곳에 복사하거나, 안전할 경우, 이 버퍼의 포인터를 리턴하면 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.