읽을 파일의 전체 라인수 구하기.

x2nine의 이미지

안녕하세요! 여기서 도움을 많이 받고 있는 C/C++ 배움이 입니다. ^^
이번에는 작동은 되는데 좀 더 좋은 코드를 알고 싶어서 올렸습니다.
솔직히 제껀 노가다 방식이라서..
텍스트 복사 프로그램인데 복사할 파일이 몇 라인인지 모르는 상태에서 전체 라인수를 구할려고 합니다.
그래서 아래와 같이 노가다식으로 했는데, 좀 더 효울적인 것이 없나 해서요.
그 값으로 배열을 잡으려고 하거든요.

#define COLUMNS 256;

int main()
{
   int line;
   char filename[20];
   filename="text.txt";
   line=lines(filename);
   char contents[line],[COLUMNS];
    ....
}

int lines(char *name) //읽을 파일의 전체 라인수 구하기.
{
        FILE *fp;
        int line=0;
        char c;
        fp=fopen(name,"r");
        while ( (c=fgetc(fp)) != EOF)
                if (c == '\n') line++;
//     while ( (fgets(line,sizeof(line),fp) != EOF)
//              line++;                이건 잘못 된 코드인가요? 이것도 될것 같은데...

        fclose(fp);

        return (line);
}
wafe의 이미지

//     while ( (fgets(line,sizeof(line),fp) != EOF)
//              line++;                이건 잘못 된 코드인가요? 이것도 될것 같은데... 

fgets 는 에러가 나거나 EOF를 읽으면 NULL을 반환합니다. 그리고, 한 줄이 sizeof(line)보다 크면 한 번에 다 못읽기 때문에 줄 수를 제대로 못 구할 겁니다.

그런데 텍스트 복사를 하는데 굳이 전체 줄 수를 알 필요가 있는지는 모르겠습니다. 그냥 fgets를 써서 처음부터 끝까지 복사해도 되지않나요?

Heejoon Lee

hados의 이미지

x2nine wrote:
안녕하세요! 여기서 도움을 많이 받고 있는 C/C++ 배움이 입니다. ^^
이번에는 작동은 되는데 좀 더 좋은 코드를 알고 싶어서 올렸습니다.
솔직히 제껀 노가다 방식이라서..
텍스트 복사 프로그램인데 복사할 파일이 몇 라인인지 모르는 상태에서 전체 라인수를 구할려고 합니다.
그래서 아래와 같이 노가다식으로 했는데, 좀 더 효울적인 것이 없나 해서요.
그 값으로 배열을 잡으려고 하거든요.

#define COLUMNS 256;

int main()
{
   int line;
   char filename[20];
   filename="text.txt";
   line=lines(filename);
   char contents[line],[COLUMNS];
    ....
}

int lines(char *name) //읽을 파일의 전체 라인수 구하기.
{
        FILE *fp;
        int line=0;
        char c;
        fp=fopen(name,"r");
        while ( (c=fgetc(fp)) != EOF)
                if (c == '\n') line++;
//     while ( (fgets(line,sizeof(line),fp) != EOF)
//              line++;                이건 잘못 된 코드인가요? 이것도 될것 같은데...

        fclose(fp);

        return (line);
}

저도 아는게 없지만... :)

일단 텍스트 복사 프로그램인데 복사할 파일이 몇 라인인지 모르는 상태에서 전체 라인수를 구하신다면 1. 파일을 한 번 읽어서 전체 라인 수를 구하고 2. 그 라인 수 만큼의 배열을 잡아서 복사를 하실테니 파일을 한 번 더 읽음...
이렇게 되겠지요? 그럼 한 파일을 복사하는데 I/O 를 두 번 하게 되는 셈이니 좀 지양해야 하는 방식이 아닌가 합니다. I/O 를 많이 사용할 수록 성능은 떨어질테니 말이지요.

//     while ( (fgets(line,sizeof(line),fp) != EOF)
//              line++;

이 부분은 line 이 int 인데 저렇게 인자로 넣어 주신 것은 오타겠지요? :o

   char filename[20];
   filename="text.txt";

저는 컴파일 해 보니 이 부분이
incompatible types in assignment
라고 나오면서 컴파일이 안 되던데...되나보죠?

텍스트 복사 프로그램 이라면 뭐...언제나 복사할 파일의 라인수는 모르는 상태겠지요. 라인수를 꼭 미리 알고 복사를 해야 한다면 모르겠으나...그런 것이 아니라면 그냥 한 줄씩 읽어서 복사하는 것이 좀 더 낫지 않나 생각합니다.

일단 저도 하하하하하하하하하하하수 이다 보니 ㅡ.ㅡ;;; (약간 오바했나... :lol: ) 고수님들께서 멋진 설명 해 주시겠지요... :)

세벌의 이미지

꼭 C 언어로 해야 되는 게 아니라면
wc -l
이렇게 해도 됩니다.

ftfuture의 이미지

음. 읽으면서 '\n' 의 갯수를 세아려도 되지 않을까요?

ㅡ,.ㅡ;;의 이미지

sebul wrote:
꼭 C 언어로 해야 되는 게 아니라면
wc -l
이렇게 해도 됩니다.

C로도 하면되죠..ㅎㅎ 파이프로 결과받으면됩니다.


----------------------------------------------------------------------------

ㅡ,.ㅡ;;의 이미지

x2nine wrote:
안녕하세요! 여기서 도움을 많이 받고 있는 C/C++ 배움이 입니다. ^^
이번에는 작동은 되는데 좀 더 좋은 코드를 알고 싶어서 올렸습니다.
솔직히 제껀 노가다 방식이라서..
텍스트 복사 프로그램인데 복사할 파일이 몇 라인인지 모르는 상태에서 전체 라인수를 구할려고 합니다.
그래서 아래와 같이 노가다식으로 했는데, 좀 더 효울적인 것이 없나 해서요.
그 값으로 배열을 잡으려고 하거든요.

#define COLUMNS 256;

int main()
{
   int line;
   char filename[20];
   filename="text.txt";
   line=lines(filename);
   char contents[line],[COLUMNS];
    ....
}

int lines(char *name) //읽을 파일의 전체 라인수 구하기.
{
        FILE *fp;
        int line=0;
        char c;
        fp=fopen(name,"r");
        while ( (c=fgetc(fp)) != EOF)
                if (c == '\n') line++;
//     while ( (fgets(line,sizeof(line),fp) != EOF)
//              line++;                이건 잘못 된 코드인가요? 이것도 될것 같은데...

        fclose(fp);

        return (line);
}

버퍼를 하나 잡고 라인단위로 읽으면서 버퍼가 찼다면 마지막문자를 검사해보고
마지막이 \n 이 아니면 스킵하면서 끝까지 읽으시면 됩니다...

복사할프로그램의 용도는 알수 없으나 그렇게 하면 성능떨어지고 프로그램하기 힘들고..자원낭비되고.. .ㅡ,.ㅡ;;
한줄읽어처리 하고 다시읽거나..라인단위적재하면서 메모리리올록하시는게 맞을겁니다.


----------------------------------------------------------------------------

Testors의 이미지

일정크기의 버퍼를 잡아서 EOF 만날때까지 fread() 로 읽은 다음에
매번의 읽은 메모리 블럭에서 '\n' 의 갯수를 누적하세요.

fgets() 도 어짜피 그런식으로 구현되어 있는데
fgets() 쓰고 거기다 또 검사하는것보다는 빠르겠죠.

참고로 fgetc() 를 쓰면 표준입출력의 버퍼링을 제대로 못쓸 수도 있을것 같네요. 어짜피 다 읽어야 하는데 메모리 되는만큼 읽는게 좋을듯.

yielding의 이미지

배열의 크기는 컴파일 타임에 결정되야 하므로 라인을 다 읽고 배열 잡을 수 없습니다. 동적할당 해야죠..
C++를 쓰신다면 STL의 vector나 list에 string을 읽어 넣어서 아래 처럼 쓰시면 될듯.

#include <vector>
#include <string>
#include <fstream>
#include <iostream>
#include <cassert>

using namespace std;

int main (int argc, char **argv)
{
    ifstream  iFile(argv[1]); assert(iFile);
    ofstream  oFile(argv[2]); assert(oFile);
    vector<string> lines;

    string line;
    while(getline(iFile, line)) 
        lines.push_back(line);

    //......
    int lineNo = lines.size();
    // .....

    return 0;
}

Life rushes on, we are distracted

ㅡ,.ㅡ;;의 이미지

Testors wrote:
일정크기의 버퍼를 잡아서 EOF 만날때까지 fread() 로 읽은 다음에
매번의 읽은 메모리 블럭에서 '\n' 의 갯수를 누적하세요.

fgets() 도 어짜피 그런식으로 구현되어 있는데
fgets() 쓰고 거기다 또 검사하는것보다는 빠르겠죠.

참고로 fgetc() 를 쓰면 표준입출력의 버퍼링을 제대로 못쓸 수도 있을것 같네요. 어짜피 다 읽어야 하는데 메모리 되는만큼 읽는게 좋을듯.

저는 완벽하게 속도만 고려한다든지 하는것보다 프로그래밍의 편의성을위해서나 하다못해 시각적인 효과도 고려하여 적당한선에서 타협하는스타일입니다..

보아하니 위같은부분에서는 궂이 버퍼크기만큼읽어서 다시 루프를돌며 \n을 검색하는것보다
라인을 구하는것이니 라인단위읽기가 더맞는게 아닌가 혼자생각해봅니다...
만일 라인길이를 어느한도이하라고 규정할수 있다면 버퍼크기초과는 고려안할수도 있으니까요..

모든것의 최상의 효과를 고려하자면 결국 C로 할게 아니라 어셈블로 해야하는게되죠.. 즉, 말하자면 있는것은 활용할수있는방향으로 가는식이죠..

--------------------------------------------
나만의 개똥철학: 프로그래밍도 타협이다..


----------------------------------------------------------------------------

Testors의 이미지

ㅡ,.ㅡ;; wrote:

저는 완벽하게 속도만 고려한다든지 하는것보다 프로그래밍의 편의성을위해서나 하다못해 시각적인 효과도 고려하여 적당한선에서 타협하는스타일입니다..

보아하니 위같은부분에서는 궂이 버퍼크기만큼읽어서 다시 루프를돌며 \n을 검색하는것보다
라인을 구하는것이니 라인단위읽기가 더맞는게 아닌가 혼자생각해봅니다...
만일 라인길이를 어느한도이하라고 규정할수 있다면 버퍼크기초과는 고려안할수도 있으니까요..

모든것의 최상의 효과를 고려하자면 결국 C로 할게 아니라 어셈블로 해야하는게되죠.. 즉, 말하자면 있는것은 활용할수있는방향으로 가는식이죠..

--------------------------------------------
나만의 개똥철학: 프로그래밍도 타협이다..

음.. 생각난김에 작성해 보았는데,
보시기에 아래 코드가 시각적으로 보기 좋지 않은가요?
라인길이 한도를 두는것은 좋은 아이디어는 아닌것 같고,
결국 fgets() 로 읽어서 검사를 하려면 아래 코드보다 난해해 질것 같은데요..
I/O 단위도 분명 더 많아질거라고 생각하는데..
혹시 더 간결한 fgets() 를 사용하는 코드를 올려주시면 참고하겠습니다.
제 머리로는 아이디어가 떠오르질 않네요 ^^

and..

좋은 컴파일러에서라면 C 로 작성하는게 어셈으로 작성하는것보다 빠른 경우도 많습니다. :wink:
아마도 최근 환경에서 어셈으로 작성했다 해서 C 보다 빠른 경우는 아마 드물 것입니다.
요새 컴파일러들이 워낙 똘똘해서 말이지요..
사람이 최적화된 어셈코드를 만들어 내는것도 최근 프로세서들의
파이프라인등에 대한 상당한 내공이 있지 않고서는 쉬운 일은 아닙니다.
그정도 수준의 최적화란게 옛날만큼 간단하지가 않아요..
저 스스로도 몇번 덤벼 봤는데 아직까지 어셈으로
제 플랫폼의 컴파일러가 만들어내는 코드보다 괜찮은 코드를 만들어 내본 경험이 별로 없군요.. -_-;

#include <stdio.h>

unsigned countNL( char * p, char * end )
{
      unsigned cnt = 0;
      for( ; p != end; ++p ) if( *p == '\n' ) cnt++;
      return cnt;
}

int main()
{
    size_t   size;
    unsigned cnt = 0;
    char     buf[4096];

    while( !feof( stdin ) )
    {
        size = fread( buf, 1, sizeof(buf), stdin );
        cnt += countNL( buf, buf+size );
    }

    printf( "%u\n", cnt );

    return 0;
}
ㅡ,.ㅡ;;의 이미지

Testors wrote:

음.. 생각난김에 작성해 보았는데,
보시기에 아래 코드가 시각적으로 보기 좋지 않은가요?
라인길이 한도를 두는것은 좋은 아이디어는 아닌것 같고,
결국 fgets() 로 읽어서 검사를 하려면 아래 코드보다 난해해 질것 같은데요..
I/O 단위도 분명 더 많아질거라고 생각하는데..
혹시 더 간결한 fgets() 를 사용하는 코드를 올려주시면 참고하겠습니다.
제 머리로는 아이디어가 떠오르질 않네요 ^^

#include <stdio.h>

unsigned countNL( char * p, char * end )
{
      unsigned cnt = 0;
      for( ; p != end; ++p ) if( *p == '\n' ) cnt++;
      return cnt;
}

int main()
{
    size_t   size;
    unsigned cnt = 0;
    char     buf[4096];

    while( !feof( stdin ) )
    {
        size = fread( buf, 1, sizeof(buf), stdin );
        cnt += countNL( buf, buf+size );
    }

    printf( "%u\n", cnt );

    return 0;
}

제가짠다면 머이런식...
실제 핵심은 for 문 루프한번으로 처리되죠..


#include <stdio.h>
#define BSIZE    1024

int fline_cnt( char *name )
{ 
    FILE *fp; 
    char buf[BSIZE];
    int i; 

    fp = fopen( name, "r" ); 
    for( i = 0, buf[BSIZE-2] = 0; fgets( buf, BSIZE, fp );  buf[BSIZE-2] = 0 )
        ( buf[BSIZE-2] && buf[BSIZE-2] != '\n' )? : i++;

    fclose(fp); 
    return i; 
}


int main( void )
{
    printf( "Line cnt [%d]\n", fline_cnt( "aaa" ));
    return 0;
}


----------------------------------------------------------------------------

Testors의 이미지

ㅡ,.ㅡ wrote:
제가짠다면 머이런식...
실제 핵심은 for 문 루프한번으로 처리되죠..


#include <stdio.h>
#define BSIZE    1024

int fline_cnt( char *name )
{ 
    FILE *fp; 
    char buf[BSIZE];
    int i; 

    fp = fopen( name, "r" ); 
    for( i = 0, buf[BSIZE-2] = 0; fgets( buf, BSIZE, fp );  buf[BSIZE-2] = 0 )
        ( buf[BSIZE-2] && buf[BSIZE-2] != '\n' )? : i++;

    fclose(fp); 
    return i; 
}


int main( void )
{
    printf( "Line cnt [%d]\n", fline_cnt( "aaa" ));
    return 0;
}

시각적으로 보기 좋느냐 그렇지 않느냐는 상당히 주관적인 부분 같습니다.
가령 저같은 경우는 제 소스가 더 깔끔해 보이지만 "ㅡ,.ㅡ" 님은 다른 생각이시겠지요.
저같은 경우 코드의 외양은 루프를 한번 더 쓰냐 마느냐 보다 사람이 얼마나 읽기 쉬우냐를 더 신경 쓰는 편인데
일단 이부분은 논쟁의 소지가 있으므로 논외로 하지요. :wink:

다만 제가 fread() 를 쓰는게 좋겠다고 한 이유는 fread() 와 fgets() 의 성능차이가 경우에 따라서 꽤 많이 날 수 있기 때문입니다. "실제 핵심은 for 문 루프한번으로 처리되죠.. " 라고 하신걸로 봐서 아마 성능쪽 문제도 생각하신게 아닐까 싶습니다만..

일반적인 경우 "ㅡ,.ㅡ" 님의 코드와 제코드는 속도차이가 크게 나지 않겠지만 (하지만 제 코드가 더 느린 경우는 많지 않을 것입니다. ) '\n' 갯수가 많으면 많을수록 fread() 를 이용하는것이 빠르겠지요?

예를 들자면 '\n' 만으로 이루어진 파일의 라인수를 센다고 해봅시다. 5M 가량의 파일을 이용해 제 시스템에서 테스트해보니 제 코드가 10배 이상 더 빠르군요. ( 파일크기가 크면 클수록 차이는 더 벌어집니다. )

testors.net:/home/testors> time ./t1 < testfile
5046272
0.068u 0.045s 0:00.11 90.9%     6+228k 0+0io 0pf+0w
testors.net:/home/testors> time ./t2 testfile
Line cnt [5046272]
1.497u 0.031s 0:01.53 99.3%     5+196k 0+0io 0pf+0w

0.11 초와1.53 초의 차이.. 이정도라면 '적당히 타협' 하기에는 좀 아까운 차이겠지요? :wink:

ㅡ,.ㅡ;;의 이미지

Testors wrote:

시각적으로 보기 좋느냐 그렇지 않느냐는 상당히 주관적인 부분 같습니다.
가령 저같은 경우는 제 소스가 더 깔끔해 보이지만 "ㅡ,.ㅡ" 님은 다른 생각이시겠지요.
저같은 경우 코드의 외양은 루프를 한번 더 쓰냐 마느냐 보다 사람이 얼마나 읽기 쉬우냐를 더 신경 쓰는 편인데
일단 이부분은 논쟁의 소지가 있으므로 논외로 하지요. :wink:


루프도 두번들어갈뿐만아니라 소스량도거의 두배( main등 구현로직과 상관없는부분이고 님이파일오픈추가한다고 보시면 님소스는 더늘어나겠죠..)에
해당하며 함수구조도 2단계인데 그리구조화된편은 아닌편이네요 또한 변수사용량 도 2배는되고..

따라서 결국 동일한프로그래밍하는데 있어 2배의 시간과 노력이 필요하게되겠죠 더구나.. 시스템 자원또한 2배가량 차지하게 됩니다.
일단 프로그래밍하는데 개발기간이 2배나 더걸린다는건 아주 중요한문제죠
제가말하고 싶었던건 바로 이점입니다.

Quote:

다만 제가 fread() 를 쓰는게 좋겠다고 한 이유는 fread() 와 fgets() 의 성능차이가 경우에 따라서 꽤 많이 날 수 있기 때문입니다. "실제 핵심은 for 문 루프한번으로 처리되죠.. " 라고 하신걸로 봐서 아마 성능쪽 문제도 생각하신게 아닐까 싶습니다만..

아뇨.. 제가위에도 말했듯이. 성능은과 다른장단점과 타협을한다는것이 바로 성능을 어느정도 포기한다는 뜻이죠.. 성능을 전적으로 생각한다면 저렇게 짤순 없죠
일반적으로 충분할것으로 본다는거였죠..
만일 성능이 중요한문제라면.. 다르게 생각해야죠..

Quote:

일반적인 경우 "ㅡ,.ㅡ" 님의 코드와 제코드는 속도차이가 크게 나지 않겠지만 (하지만 제 코드가 더 느린 경우는 많지 않을 것입니다. ) '\n' 갯수가 많으면 많을수록 fread() 를 이용하는것이 빠르겠지요?

예를 들자면 '\n' 만으로 이루어진 파일의 라인수를 센다고 해봅시다. 5M 가량의 파일을 이용해 제 시스템에서 테스트해보니 제 코드가 10배 이상 더 빠르군요. ( 파일크기가 크면 클수록 차이는 더 벌어집니다. )

0.11 초와1.53 초의 차이.. 이정도라면 '적당히 타협' 하기에는 좀 아까운 차이겠지요? :wink:

극단적인 테스트를 하셨네요..
만일 그러한 파일들만 할것이라는 전제가 있었다면 물론 그렇게 안해야죠
그건너무나 당연한거구요.. 그래서 타협 어느선에서 이렇게 프로그램할것인가.. 라는 문제를 항상생각하게 만들죠..
여기선 질문자의 상황이 그러한전제가 없었으므로 그런상황이 아닐꺼라 예상합니다. 그래서 일반적으로는 거의 차이가 없을것으로 보입니다.

위에도 말씀드렸듯이 일반적으로
수분내지 수시간의 수행시간중 불과 0.1초도 차지 안할 부하증가 때문에
코딩분량도 2배 시스템 자원도 2배를 들여서 2배의 노력을 한다는건.. 글쎄요..
제가 워낙게을러서 전 그렇게는 안할것같내요....ㅎㅎ

[/code]


----------------------------------------------------------------------------

lsj0713의 이미지

속도는 무진장 중요합니다. 아직도 우리의 컴퓨터는 충분히 느립니다.

예전에 전시회 작품으로 XML 파서 만들때, '컴퓨터 속도는 충분히 빠르니까 그냥 무작정 소스코드 보기 이쁘게만 만들자'라고 생각하고 달려들었다가 낭패를 본 적이 있습니다. (결국 작품은 말아먹고...-_-;) 나중에 회사 병특간 후배 얘기를 들어보니까 MS XML 라이브러리도 제것만큼은 아니었지만 상당히 느리다고 하더군요. MS가 만들어도 느린 라이브러리에 저는 너무 여유를 부렸던 겁니다.

특히나 파일 I/O를 처리하는 프로그램이라면... 더더욱 목숨걸 필요가 있다고 생각합니다.

그런면에서 저는 fread에 한표 걸겠습니다. 루프가 두번 들어간다고 해도 실제로는 둘다 O(n)입니다.

sozu의 이미지

저도 fread()에 한표 던지겠습니다. :D

근데 전 fread도 잘 않쓰는데^^;

read 로...;;;

아...글의 주제랑 딴소리를 해버렸네요^-^

암튼 그냥 각자 나름데로의 프로그래밍 스타일이죠~~

이궁;

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

ixevexi의 이미지

저도 이런 문제로 고민했었습니다.
/ 너무 답답해서 텍스트파일 핸들러를 따로 만들까 생각했었습니다.
/ 한줄뒤, 한줄 앞, 라인 에디팅 같은것이 지원되는 거요

그래서 관심을 가지고 읽어보았는데
이상한 코드가 있네요

Quote:

string line;
while(getline(iFile, line))
lines.push_back(line);

위에서 저런 getline함수가 있나요? @.@
저런게 있었다면 프로그래머들이 고민할 필요도 없죠
하지만 제가 알기론 없는데 -_-
string에 바로 쓸 수 있는것 //즉 동적할당이 바로바로 되는것!

궁금하네요

C++, 그리고 C++....
죽어도 C++

Testors의 이미지

Quote:
위에도 말씀드렸듯이 일반적으로
수분내지 수시간의 수행시간중 불과 0.1초도 차지 안할 부하증가 때문에
코딩분량도 2배 시스템 자원도 2배를 들여서 2배의 노력을 한다는건.. 글쎄요..
제가 워낙게을러서 전 그렇게는 안할것같내요....ㅎㅎ

find /usr -name \*.h -exec wc {} \;

&

코딩분량은 비슷 & 자원은 동일함 & 노력은 비슷

코드가 읽기 쉽느냐는 각자의 주관에 따라~ :)

그래도 덧붙이자면,

1 line 에 여러 의미와 수행을 우겨넣고 라인수가 적으니 코드분량도 적고 이해가 쉽다~ 라고 생각하신다면.. 글쎄요.. Code Complete 나 Writing Solid Code 같은 책을 읽어 보시라는것 말고는 더이상 해드릴 얘기가 없군요. : P

yielding의 이미지

Quote:

위에서 저런 getline함수가 있나요? @.@
저런게 있었다면 프로그래머들이 고민할 필요도 없죠
하지만 제가 알기론 없는데 -_-
string에 바로 쓸 수 있는것 //즉 동적할당이 바로바로 되는것!

궁금하네요

STL의 string::getline 입니다. STL을 지원하는 모든 플랫폼에서 쓸수 있습니다.

예제를 보면
1. getline이 string의 reference를 입력으로 받고
2. 그다음 입력 스트림(iFile)에서 line을 읽어서 읽어서 string을 채우고
3. lines.push_back은 string을 copy해서 vector에 넣죠.

getline의 내부를 살짝 보면
1. 입력 스트링(line)을 erase하고 (line.erase)
2. for loop를 한번 돌면서(O(n)) 깔끔하게 스트림포인터를 증가시키고
3. string의 operator +=를 써서 스트림에서 읽은 character를 line에 append
4. 혹시 여기에서 발생가능한 exception을 처리합니다.

push_back은 line을 deep copy (line의 copy constructor가 불리겠죠)

제가 말한 동적할당 이야기는

int main() 
{ 
   int line; 
   char filename[20]; 
   filename="text.txt"; 
   line=lines(filename); 
   char contents[line],[COLUMNS];  <--- 요기 요렇게 못쓴다는거죠.
    .... 
} 

배열이 선언될때 사이즈가 미리 정해져야 한다는거.

Life rushes on, we are distracted

댓글 달기

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