파일에 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 한 번에 읽게 한다. => 할 수만 있다면 이게 가장 좋겠네요.
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 를 이용해서 해보고 싶습니다. 근데 정말 어렵네요 ㅠ 혹시 생각나는 방법이나 코딩이 있으신지요
텍스트 포맷에 대한 자세한 정보
<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]
파일에 보면
파일에 보면
이름이 kim이랑 park은 사이즈가 다르기 때문에 이것도 생각해서 해결하자면
어떤 방법이 있을까요
fgets() 를 쓰시면 될 겁니다.
fgets() 를 쓰시면 될 겁니다.
char *fgets(char *s, int size, FILE *stream);
size 만큼 파일에서 읽지만 EOF나 NEWLINE을 만나면 읽기를 중단하고 읽은 문자열을 넘겨 줍니다.
더 자세한 것은 google에서 fgets 를 검색해 보세요.
fgets는 고수준 파일입출력 아닌가요?
fgets는 고수준 파일입출력 아닌가요?
fgets() 함수 소스를 찾아보니 fgets()
fgets() 함수 소스를 찾아보니 fgets() 함수는 내부에서 fgetc() 함수를 쓰고,
다시 fgetc() 함수는 내부에서 read() 를 쓰네요.
한번 살펴보세요.
아 그렇군요! 감사합니다
아 그렇군요! 감사합니다
자바같은경우는 api를 참조하여 이해할 수 있는데
C는 어떻게 봐야하나요?
저는 네이버나 구글 검색해서 블로그같은데 올라온거를 통해서 보고 있는데
더 자세한 내용을 알고 싶네요!
google에서 fgets source code 라고
google에서 fgets source code 라고 검색하시면 나옵니다.
다른 stdlib 있는 소스들도 다 검색되니 참고하세요.
아니면 gcc stdlib (glibc) 소스를 받으셔도 되고요.
한 줄만 읽으려면 개행문자의 위치를 알고 거기까지
한 줄만 읽으려면 개행문자의 위치를 알고 거기까지 읽어야 한다는 건데, 그러려면 개행문자의 위치를 미리 알 수 있어야죠.
근데 개행문자의 위치를 미리 알 수 없다면? 글쎄요, 뭐 이런 방법들이 있겠죠.
1. read로 1바이트씩 읽어들어와서 개행문자를 발견할때까지 읽는다.
=> 성능이 매우 떨어질겁니다. syscall은 비싸니까요.
2. 한번에 많이씩 읽어들어와서 개행문자를 찾는다. 개행문자가 발견되면 lseek을 써서 그 시점으로 되돌린다.
=> 일반 파일들에 대해서는 잘 동작할겁니다. 하지만 되돌릴 수 없는 파일들도 있죠. 소켓이라던가 파이프라던가.
3. 한번에 많이씩 읽어들어와서 버퍼에 킵해놓고 개행문자 전까지만 반환한다.
=> fgets의 작동원리입니다. 바꿔 말해서, 이걸 직접 짜느니 fgets를 쓰세요.
4. 컴퓨터에게 미래를 예지하는 법을 가르쳐서 개행문자가 있는 곳까지 read 한 번에 읽게 한다.
=> 할 수만 있다면 이게 가장 좋겠네요.
buf[1024] /* 데이터가 존재한다고 가정 */
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 를 이용해서 해보고 싶습니다.
근데 정말 어렵네요 ㅠ 혹시 생각나는 방법이나 코딩이 있으신지요
댓글 달기