파일을 읽어서 출력 할 때...
글쓴이: 사랑천사 / 작성시간: 토, 2006/04/01 - 2:19오전
int main (int argc, char **argv) { /* int파트 */ unsigned long int line; unsigned long int c; unsigned long int c2; int linenum = 0; /* 라인번호 출력 여부 결정 */ unsigned long int file_size; /* char파트 */ char fn [100]; char *data; char **text; char *buff2; char key; /* FILE파트 */ FILE *fd; if (argc == 2 && strcmp (argv[1], "-h") == 0) { help (); exit (0); } if (argc == 2 && strcmp (argv[1], "-l") == 0) { linenum=1; } printf ("파일명을 입력하여 주십시요.\n" "파일명:"); gets (fn); if (strlen (fn) == 0) { puts ("파일명이 입력되지 않았습니다."); puts ("프로그램을 종료합니다."); exit (0); } fd = fopen (fn, "rt"); if (fd == NULL) { printf ("파일을 열 수 없습니다. - %s\n", fn); gets (""); exit (1); } printf ("읽어 오는 중... - %s\n", fn); c = 0; do { if (feof (fd)) { puts ("파일 읽기에 성공."); *data += '\0'; break; } key = fgetc (fd); *data += key; c++; } while (1); file_size = c - 1; puts ("file_size <== c"); c = 0; puts ("c = 0"); c2 = 0; puts ("c2 = 0"); strcpy (buff2, data); puts ("복사 성공."); printf ("File-Size:%ld, File-Name:%s\n", file_size, fn); printf ("%s\n", *buff2); while (1) { if (c >= file_size) break; while (c <= file_size) { if (text[c2][geshifilter-c] == '\n') break; text[c2] += data[c]; printf ("%ld\n", c); c++; } c2++; } line = c2; c = 0; c2 = 0; if (linenum == 1) { while (c <= line) { printf ("%-3d:%s\n", c + 1, text[c]); c++; } } else { while (c <= line) { printf ("%s\n", text[c]); c++; } } fclose (fd); gets (""); } if (linenum == 1) { while (c <= line) { printf ("%-3d:%s\n", c + 1, text[c]); c++; } } else { while (c <= line) { printf ("%s\n", text[c]); c++; } } fclose (fd); gets (""); }
char buff [8192 + 1];
이런 식으로 해 놓고 파일을 쭈욱 읽어서 출력 하기는 쉽죠. 배열 대입 하면 되니까. 근대 이건 영...
그리고 저것을...
int main (int argc, char **argv) { /* int파트 */ unsigned long int line; unsigned long int c, c2, c3; int linenum = 0; /* 라인번호 출력 여부 결정 */ unsigned long int file_size; /* char파트 */ char fn [100]; char *data; char **text; char *buff2; char key; /* FILE파트 */ FILE *fd; if (argc == 2 && strcmp (argv[1], "-h") == 0) { help (); exit (0); } if (argc == 2 && strcmp (argv[1], "-l") == 0) { linenum=1; } printf ("파일명을 입력하여 주십시요.\n" "파일명:"); gets (fn); if (strlen (fn) == 0) { puts ("파일명이 입력되지 않았습니다."); puts ("프로그램을 종료합니다."); exit (0); } fd = fopen (fn, "rt"); if (fd == NULL) { printf ("파일을 열 수 없습니다. - %s\n", fn); gets (""); exit (1); } printf ("읽어 오는 중... - %s\n", fn); c = 0; do { if (feof (fd)) { puts ("파일 읽기에 성공."); data[c] = '\0'; break; } key = fgetc (fd); data[c] = key; c++; } while (1); fclose (fd); file_size = c - 1; c = 0; c2 = 0; c3 = 0; while (1) { if (c > file_size) break; while (c <= file_size) { if (data[c] == '\n') break; text[c2][c3] = data[c]; c++; c3++; } c3 = 0; c2++; } line = c2; c = 0; c2 = 0; if (linenum == 1) { while (c <= line) { printf ("%-3d:%s\n", c + 1, text[c]); c++; } } else { while (c <= line) { printf ("%s\n", text[c]); c++; } } gets (""); }
이렇게 바꾸었더니 윈도우즈에선 파일이 읽어는 집니다 정확히 내용이. 이놈을 strcpy나 strncpy로 buff2에 복사 하면 printf로 전부 출력이 되거든요. 그러나 그 다음이 안 되고요... 리눅스에서 gcc로 컴파일을 하니 정상이었습니다만 역시 세그먼트 오류가 납니다. 물론 파일을 읽는 대서 부터... 윈도우즈와 뭔가 다른 느낌...(당연히 다르겠죠.)
흐흠. 아무래도 포인터 쓰는걸 다시 배우던지 해야 될 것 같습니다 음.
아마 소스를 보시면 제 의도는 아실 겁니다 으음... 배열을 포인터로 대체 해 보겠다 뭐 이런 거죠 흐흠.
어떻게 해야 할 지 모르겠네요...
모두 행복하세요.
이여송 사도요한 드림.[/geshifilter-c]Forums:
data에 메모리를
data에 메모리를 할당하셔야 합니다. text도 마찬가지고요.
data = malloc (8192); 처럼 말이죠.
그리고 8192 바이트보다 더 읽게 되었으면 realloc을 사용하던지 해서 메모리를 늘려줘야 합니다.
네 그래서...
malloc와 free를 생각 해 봤는데요...
그렇게 하고 나서 나중에 데이터를 사용 하고 나면 포인터가 달라 질 것 같은데 그럼 free를 할때 문제가 생기지 않나요? 아래 어떤 글을 보니 그런 거 같은데요. 그럴 경우 원래 포인터의 위치를 다른 변수에 복사 해 두거나 해야 할 것 같은데 잘 모르겠군요. 예를 들면 이런 거죠.
사람천사
댓글 달기