[C] 파일입출력에 대해서..

gusdo2000의 이미지

키보드에서 읽어서 파일에 저장하기는 장 실행이 되는데..

파일에서 읽어서 터미널에 출력하기와 파일에서 읽어서 파일에 저장하기는 별별 방법을 다 써봐도 실행이 되지 않습니다.

제 생각에는 파일에서 값을 읽어오지 못하는 것 같습니다.

아래 코드에서 제가 잘못한것이 있나요?

#include <stdio.h>

int main()
{
	FILE* fp, *fp2;
	int i;
	int n =0;
	char str[100][100];
	char str2[100][100];
	int c;
	
	if( (fp = fopen("/home/happy/study/FILE/file1.txt", "w+")) == NULL ) 
	{
		fprintf(stderr,"file open failed!\n");
		exit(1);
	}
	
//키보드에서 읽어서 파일에 저장하기	
                printf(" From Keyboard To File\n");
	for(i=0; ;i++)
	{
		gets(str[i]);
		if(str[i][0] == '\0') break;
		fprintf(fp,"%i. %s\n", i, str[i]);
		printf("-- %s\n", str[i]);
	}
	
	memset(&str[0],0,sizeof(str));
	

//파일에서 읽어서 터미널에 출력하기
 	printf(" From File To Terminal\n");
//방법 #1
 	i = 0;
 	while( fscanf(fp,"%s\n",&str[i]) != EOF )
 	{
 		printf("-- %s\n", str[i]); 
 		i++;
 	}


//방법#2
 	while( (c = getc(fp)) != EOF )
 		putchar(chr);


//방법 #3 -- get_line()함수는 아래에 정의되어 있습니다.
 	i = 0;
 	while( get_line(fp, str[i]) != EOF )	
 	{
 		printf("-- %s\n", str[i]); 
 		fprintf(stdout,"-- %s\n", str[i]); 
 		i++;
 	}


//파일에서 읽어서 파일에 저장하기

	printf(" From File To File\n");
	if( (fp2 = fopen("/home/happy/study/FILE/file2.txt", "w")) == NULL ) 
	{
		fprintf(stderr,"file open failed!\n");
		exit(1);
	}
	
	
//방법 #1
	char buf[128];
	for (i = 0, n = 128; n == 128; i++)
	{
		fread(buf, 128, 1, fp);
		n = ftell(fp) - 128 * i;
		fwrite(buf, n, 1, fp2);
	}
	
	
//방법 #2
 	while( fscanf(fp,"%s\n",&str[i]) != EOF )
 	{
 		fprintf(fp2,"%s\n", str[i]); 
 		i++;
 	}
 

//방법 #3	
 	for (i = 0; i < 4; i++)
 	{
 		fscanf(fp,"%s\n",(char *)&str[i]);
 		strcpy((char *)&str2[i], (char *)&str[i]);
 		fprintf(fp2, "-- %s\n", (char *)&str2[i]); 
 	}

 	
//방법 #4
  	while( (c = getc(fp)) != EOF )
  		putc(c,fp2);

 	
//방법 #5	
 	i = 0;
 	while( !feof(fp) )
 	{
 		fgets(buf, 100, fp);
  		fprintf(fp2,"%s\n", buf);
  		i++;
  	}
			
	fclose(fp2);
	
	fclose(fp);
	printf("End...\n");
	
	return 0;
}


int get_line(FILE* fp, char* s)
{
	char* cp = s;
	while( (*s=getc(fp)) != EOF )
	{
		if( *s == '\n' )
		{
			*s = '\0';
			return 0;
		}
		else
			++s;
		
		if( cp == s ) return EOF;
		*s = '\0';
	}
	
	return 0;
}
나는오리의 이미지

파일 오픈할때 r옵션을 주세요.

gusdo2000의 이미지

fp = fopen("/home/happy/study/FILE/file1.txt", "w+"))

읽는 파일에 대해서 w+ 옵션을 주었는데요,,,

당근

kane의 이미지

``w+''  Open for reading and writing.  The file is created if it does not
        exist, otherwise it is truncated.

otherwise it is truncated
doldori의 이미지

상당히 많은 부분이 잘못되었는데 눈에 띄는 것만 말씀드리죠.

1. 각각의 방법이 끝난 후에서는 fp가 EOF에 있으므로 다시 되돌려야 합니다.
fseek(fp, 0, SEEK_SET);

2. 마지막 방법 #5는 이렇게 하세요. (C FAQ Q12.2)

    while( fgets(buf, 100, fp) ) 
    { 
        fprintf(fp2,"%s\n", buf); 
        i++; 
     } 

3. get_line()에도 버그가 있습니다.
* C FAQ Q12.1
* 맨 처음에 읽은 글자가 EOF이면 0을 반환하게 되는군요.

gusdo2000의 이미지

답변을 달아주셔서 감사합니다^^

Quote:
상당히 많은 부분이 잘못되었는데 눈에 띄는 것만 말씀드리죠.

1. 각각의 방법이 끝난 후에서는 fp가 EOF에 있으므로 다시 되돌려야 합니다.
fseek(fp, 0, SEEK_SET);

제가 위의 프로그램을 실행할때
다른 방법들은 주석처리를 하고 한 방법만 테스트 하였습니다.

그것을 그냥 설명없이 한꺼번에 코드를 올려서 오해를 하신것 같습니다.

제가 설명을 잘했어야 하는데.. ^^;;

Quote:
2. 마지막 방법 #5는 이렇게 하세요. (C FAQ Q12.2)

    while( fgets(buf, 100, fp) ) 
    { 
        fprintf(fp2,"%s\n", buf); 
        i++; 
     } 

제 코드에서 변수 c는 int로 선언되어 있습니다..^^;;

Quote:
3. get_line()에도 버그가 있습니다.
* C FAQ Q12.1
* 맨 처음에 읽은 글자가 EOF이면 0을 반환하게 되는군요.

님의 말대로 버그가 있었습니다....
감사합니다..

제가 가장 이해할수가 없는것은 저 위의 방법을 차례차례
한 방법씩 실행을 해보았는데..
한번도,,
파일에서 값을 읽어와 저장되거나.
파일에서 값을 읽어와 터미널어 출력되지 않는다는 것입니다.
제 생각에는 문법적으로 문제가 없는것 같은데..
왜 한 방법도 제대로 실행되지 않는지..
제가 뭔가 기본적으로 크게 잘못한 부분이 있는 건가요??
제발.. please...
저에게 도움을 주셨으면 합니다..

답변달아준 모든 분들 행복하세요^^
감사합니다.

당근

wariua의 이미지

gusdo2000 wrote:
제가 뭔가 기본적으로 크게 잘못한 부분이 있는 건가요??

크게 잘못하신 건 아닌 것 같습니다만:), 여튼 문제의 원인을 앞의 세 분이 이미 알려주신 것 같은데요. 혹시나 싶어서 직접 타이핑 해서 실행해 봤으나 (file => terminal 방법 1만 해보긴 했지만;; ) 잘 됩니다. (물론 앞의 분들 말씀 대로 file1.txt를 열 때 "w+" 대신 "r"를 사용하도록 바꿨습니다.)

$PWD `date`

kdoll의 이미지

파일입출력은 어지간하면 write나 mmap로 사용하심이 어떠신지?

공부중이라면야 상관은 없지만서도....

doldori의 이미지

gusdo2000 wrote:
제 코드에서 변수 c는 int로 선언되어 있습니다..^^;;

저는 이곳을 얘기한 것입니다.
int get_line(FILE* fp, char* s) 
{ 
   char* cp = s; 
   while( (*s=getc(fp)) != EOF )   // here
   { 
        /* ... */  
   } 

   return 0; 
}
gusdo2000의 이미지

해결했습니다!!

저의 잘못은..

파일에 쓴 후 파일 포인터의 위치를 다시 처음으로 돌리지 않아서 아무것도 읽지 않은 것이었습니다!

답변 달아주셔서 정말 감사합니다!!

당근

댓글 달기

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