저수준 파일입출력에서 read로 한줄만 읽을 수 있을까요?

익명 사용자의 이미지

파일에
kim a 101
lee b 202
park c 303

이렇게 되어있다면

read함수로 한줄만 읽어올 수 있을까요?
\n을 기준으로

저수준 파일입출력 함수로는 한줄을 읽어올 수 있는 방법이 없을까요?

익명 사용자의 이미지

파일에 보면
이름이 kim이랑 park은 사이즈가 다르기 때문에 이것도 생각해서 해결하자면
어떤 방법이 있을까요

라스코니의 이미지

fgets() 를 쓰시면 될 겁니다.

char *fgets(char *s, int size, FILE *stream);
size 만큼 파일에서 읽지만 EOF나 NEWLINE을 만나면 읽기를 중단하고 읽은 문자열을 넘겨 줍니다.

더 자세한 것은 google에서 fgets 를 검색해 보세요.

익명 사용자의 이미지

fgets는 고수준 파일입출력 아닌가요?

라스코니의 이미지

fgets() 함수 소스를 찾아보니 fgets() 함수는 내부에서 fgetc() 함수를 쓰고,
다시 fgetc() 함수는 내부에서 read() 를 쓰네요.
한번 살펴보세요.

익명 사용자의 이미지

아 그렇군요! 감사합니다
자바같은경우는 api를 참조하여 이해할 수 있는데
C는 어떻게 봐야하나요?
저는 네이버나 구글 검색해서 블로그같은데 올라온거를 통해서 보고 있는데
더 자세한 내용을 알고 싶네요!

라스코니의 이미지

google에서 fgets source code 라고 검색하시면 나옵니다.
다른 stdlib 있는 소스들도 다 검색되니 참고하세요.
아니면 gcc stdlib (glibc) 소스를 받으셔도 되고요.

 의 이미지

한 줄만 읽으려면 개행문자의 위치를 알고 거기까지 읽어야 한다는 건데, 그러려면 개행문자의 위치를 미리 알 수 있어야죠.
근데 개행문자의 위치를 미리 알 수 없다면? 글쎄요, 뭐 이런 방법들이 있겠죠.

1. read로 1바이트씩 읽어들어와서 개행문자를 발견할때까지 읽는다.
=> 성능이 매우 떨어질겁니다. syscall은 비싸니까요.

2. 한번에 많이씩 읽어들어와서 개행문자를 찾는다. 개행문자가 발견되면 lseek을 써서 그 시점으로 되돌린다.
=> 일반 파일들에 대해서는 잘 동작할겁니다. 하지만 되돌릴 수 없는 파일들도 있죠. 소켓이라던가 파이프라던가.

3. 한번에 많이씩 읽어들어와서 버퍼에 킵해놓고 개행문자 전까지만 반환한다.
=> fgets의 작동원리입니다. 바꿔 말해서, 이걸 직접 짜느니 fgets를 쓰세요.

4. 컴퓨터에게 미래를 예지하는 법을 가르쳐서 개행문자가 있는 곳까지 read 한 번에 읽게 한다.
=> 할 수만 있다면 이게 가장 좋겠네요.

jeff_an의 이미지

buf[1024] /* read로 읽고 buf에 저장했다고 가정 */

char *pos, *find;
pos = buf;

find = strchr(pos, '\n');
*find = '\0';
strcpy(dest_buf, pos);

pos = ++find;

위 작업 반복.

더 좋은 알고리즘도 있겠지만... 저수준으로 구현할 때는 이 방법 주로 썼네요.
아 물론 이건... read로 1바이트씩 읽어오면 오버헤드가 크니 buf두고 사용하는거구요..
라인 단위로 읽으려면 고수준이나 1바이트씩 읽으며 확인하셔야될거 같아요.

익명 사용자의 이미지

답변 감사합니다.. 현재 해결하려는 문제는
파일수정인데

저수준 파일입출력함수와 lseek 를 이용해서 해보고 싶습니다.
근데 정말 어렵네요 ㅠ 혹시 생각나는 방법이나 코딩이 있으신지요

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.