C 언어에서 다음과 같은 화일 처리는 어떻게 해야하나요?

yangam의 이미지

3.txt 라는 화일이 있습니다.
다음과 같이 3 Line 의 내용이 저장되어 있습니다.

aaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccc

여기서 bbbbbbbbbbbbbbbbbbb 의 내용을
******************* 의 내용으로 바꾸고 싶습니다.
즉, 아래와 같이 되죠.

aaaaaaaaaaaaaaaaaaaaaa
*******************
cccccccccccccccccccccc

조건은.. 임시 화일을 이용하던가 하면 안됩니다.
3.txt 화일 내에서 해결하고 싶습니다.

출력을 하면.. 무조건.. cccccccccccccccccccccc 다음 라인에 붙여져서..
해결을 하지 못하고 있습니다.

어떻게 해야하나요?

그리고 보통 프로그램을 만들 때,
이와 같은 경우에 파일 처리를 어떻게 하나요?

(이와 같은 경우란, 어떤 파일의 특정 부분만을 바꾸고자 하는 경우를 지칭합니다.)

답변 부탁드립니다 ㅎ_ㅎ;

yangam의 이미지

온라인 상의 책이라도..;
제가 무지해서 그럴 가능성이 높아보이지만...
왠지.. 제가 갖고 있는 책들은 파일 입출력 부분에서는 비중있게 다루는 것 같지 않네요;

작은 것들, 사소한 것들을 소중히 여기고,
항상 최선을 다하는 멋진 사람이 되고 싶다.
그들이 나에게 일깨워준 것처럼,
그들 자신이 얼마나 소중한 존재인지 알 수 있도록
도와주는 그런 좋은 사람이 되고 싶다

정태영의 이미지

파일 전체를 버퍼링하지 않는 이상은...
임시파일을 사용하지 않고 할 수 없을 듯 합니다..
....

아니면.. 정확하게 같은 바이트수만큼만을 딱 고치는 거라면..
"w"옵션만을 주고 fopen을 해서..

해당라인의 위치에.. fseek을 해주고..

fwrite로 해주면 될겁니다..

뒤에 붙는다는거보니.. "a" 옵션을 주고 fopen을 하신듯 하군요..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

불량청년의 이미지

정태영님께서 말씀하셨듯이

파일을 포인터 배열에 저장해서 해당 라인의

위치를 알아내고 바뀔 라인에 새로운 데이터를 입력하고

파일을 처음부터 다시 쓰면 되겠네요.

만약 파일 내의 해당 라인을 삭제하는 것이라면

파일 전체 싸이즈를 알아낸 후, 나중에 삭제될 라인의

바이트를 알아내서 truncate();로 파일을 잘라내면

되겠네요.

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

revizes의 이미지

#include <stdio.h>

int main(int argc, char *argv[])
{
        FILE *data_file;
        char temp[1024];
        char temp1[1024];
        long offset;

        data_file = fopen("3.txt", "r+");

        temp1[0] = '*'; temp1[1] = '\0';

        while (fread(temp, 1, 1, data_file)) {
                if (temp[0] == 'b') {
                        fseek(data_file, -1, SEEK_CUR);
                        fwrite(temp1, 1, 1, data_file);
                }
        }

        fclose(data_file);
        return 0;
}

그냥 글 읽어내려가다가 생각지 못한 것이라..함해봣으요..
대충...2~3분에 짠거라...
무쟈게 지저분..-_-;

다 덤벼! 다 받아줄께!!

kdoll의 이미지

가장 탐스러운 방법은 file mmap해서

b만나면 *로 바꿔주세요.. ^^;

mmap에 대한것은 man mmap하시면 나올듯

스티븐슨 2판 2번째 책에도 있을겁니다.

이번기회에 배워두심 두고두고 좋은 mmap입니다.

나중에 되시면 lseek, read, write보다

mmap사용하시면서 어이 편하다 하실껍니다..^^;

pynoos의 이미지

#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>

void get_mapsize( FILE * f, long *filesize, long *mapsize)
{
        struct stat st;
        int ps;

        ps = getpagesize();

        fstat( fileno(f), &st );
        *filesize = st.st_size;
        *mapsize = (st.st_size + ps)/ps*ps;
}

int main()
{
        FILE * f;
        char * buf;
        long s,filesize;
        long i;

        f = fopen( "a.txt", "r+" );

        if( !f ) 
        {
                perror("fopen");
                return 0;
        }

        get_mapsize(f, &s, &filesize);

        buf = (char *)mmap( 0, s, PROT_READ | PROT_WRITE, MAP_SHARED, fileno(f), 0 );
        if( buf == MAP_FAILED )
        {
                perror("mmap");
                return 0;
        }

        for( i=0; i<filesize; i++ )
        {
                if( buf[i] == 'b' )
                {
                        buf[i] = '*';
                }
        }

        msync( buf, s, MS_SYNC );
        munmap( buf, s );
        return 0;
}

재미로 작성해 봤습니다.

하하의 이미지

   *mapsize = (st.st_size + ps)/ps*ps;

이건 무슨 계산법인가요? ㅎ

“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”

pynoos의 이미지

(0 + 4) / 4 * 4 = 4
(1 + 4) / 4 * 4 = 4
(2 + 4) / 4 * 4 = 4
(3 + 4) / 4 * 4 = 4
(4 + 4) / 4 * 4 = 8
(5 + 4) / 4 * 4 = 8
(6 + 4) / 4 * 4 = 8
(7 + 4) / 4 * 4 = 8
(8 + 4) / 4 * 4 = 12

크면서 가까운 배수를 구하는 식입니다.

gizrak의 이미지

위에 어느 분께서 쓰셨던 mmap이 가장 좋은 방법이 아닐까요? ㅋ

void main(void)
{
char *brain;
brain = malloc(sizeof(stress));

free(brain);
}
뭐든지 답은 간단한데서 시작한다.

댓글 달기

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