2011. 4. 4. 15:21



어쿠....
제가 진행하는 프로잭트는 거의 Win32프로젝트 입니다.

닷넷환경에 익숙한 저한테는 너무 가혹한 ㅜㅡ
어찌됬건 MFC조차 사용하면 안되는 환경에서 코딩을 하다보니 MFC로 된 자료를 보면 혈압이 올라서 정리해 둡니다.

.txt 파일을 읽고쓰는건 기초중에 기초라고 할수 있는데도 불구하고 MFC자료만-_-;;;


 
1. 기본 쓰기 읽기


#include "stdafx.h"

#include 
#include 
#include 
void LoadFile()
{
	//*.txt에 쓰기

	FILE *fp;
	fp = fopen("test.txt","wt");
	fwrite("sddfsfasd", sizeof(char[10]), 1, fp);
	fclose(fp);	 

	//*.txt를 읽기
	FILE *fp;
	int i = 0;

	fp = fopen("test.txt", "rt");
	char a[10];	 

	while( !feof(fp) )
	{
		i = i + 1;
		fread(&a,sizeof(char[10]),1,fp);

		printf("%s",a);
		MessageBox(NULL,a ,0,0);
	}

	fclose(fp);
}

간단하저?


 
2. 구조체 사용
구조체를 이용해서 읽고 써봅시다.
구조체를 사용할때는 데이터의 크기가 정확하게 맞지않으면 데이터의 정확성을 보장할수 없으니 주의하기 바랍니다.

#include "stdafx.h"

#include 
#include 
#include 

typedef struct test
{
    char name[10];
    char number[20];
    test *link;
}test_Node;

test_Node T,S;
test_Node *TEST;

void LoadFile()
{
    int i = 0;
    TEST = (test_Node *)malloc(sizeof(test_Node));

    FILE *fp;

    fp = fopen("test.txt", "wt");
    
    strcpy(TEST->name, "aaaa");
    strcpy(TEST->number, "200-2000");

    fwrite(TEST, sizeof(test_Node), 1, fp);

    strcpy(TEST->name, "bbbb");
    strcpy(TEST->number, "200-2000");

    fwrite(TEST, sizeof(test_Node), 1, fp);

    fclose( fp );

    printf("저장한 내용=> %s,%s\n\n", TEST->name, TEST->number);

    fp=fopen("test.txt", "rt");

    while( !feof(fp) )
	{
        i = i + 1;
        fread(&S, sizeof(test_Node), 1, fp);
        printf("%d번째 실행=>> %s, %s\n" , i, S.name, S.number);
    }
    printf("\n\n실행횟수==>%d\n", i);

    fclose(fp);
}

코드 만들기 귀찬아서 다른사람꺼 그대로 빼껴왔습 ㅋㅋㅋㅋ
알아서들 쓰시길
복잡한것도 없으니-_-;;

 
3. 한줄씩 읽기
fread함수는 정해진 규칙이있는 택스트파일을 읽어올때 힘을 발휘 하는데 보통 텍스트파일을 처리할때 한줄씩 처리하는 것이 일반적이기때문에 fread 보다는 fgets를 쓰는 것이 좋습니다.
void LoadFile()
{
	int i = 0;
	FILE *fp;
	fp = fopen("Target.txt","rt");

	while(fgets(strTemp, 513,fp)!=NULL)
	{
		++i;

		sprintf( tmp, "%s", strTemp );
		MessageBox(NULL,tmp ,0,0);
	}

	fclose(fp);
}

실행해보면 할줄씩 불러 옵니다.
이제 적당이 가공해서 쓰면 됩니다.
참고로 i = i +1;은 번호 채크하려고 쓰는겁니다.(i++써도 관계없습니다....이걸 왜 설명하고 있지 OTL)


 
4. 파일 읽기 함수를 통한 구조체 전달
파일 한두개 읽을 때야 직접 코드를 넣어사용하거나 따로 함수를 빼서 적역변수든 포인터든 넘겨도 되지만 파일이 여러개인 경우에는 포인터뿐이 답이 없습니다.(여러가지 면에서)
이번 파트는 함수를 만들어 구조체포인터로 데이터를 받아봅시다.

//파일 불러오기 구조체
typedef struct tTest
{
 char  *strTest;
 int   intTest;

} typeTest;

void LoadFile(char* strDir, typeTest *testTemp)
{
	//파일을 읽어들인다.

	FILE *fp;
	fp = fopen( strDir, "rt");

	char strTempText[2048];
	fread( &strTempText, sizeof(char[2048]), 1, fp);

	testTemp->intTest = _filelength(_fileno(fp));
	fclose(fp);

	testTemp->strTest = new char[testTemp->intTest ];
	testTemp->strTest = (char*)malloc( testTemp->intTest  + 1);
	memset(testTemp->strTest , 0, sizeof(char) * (testTemp->intTest + 1)); 

	for( int i = 0 ; i < testTemp->intTest ; ++i)
	{
		testTemp->strTest[i] = strTempText[i];
	}
}

이렇게 선언하고 사용은

 //파일데이터
 typeTest testFileData;

//직급 변환
 LoadFile("Class.txt", &testFileData);
sprintf( strTemp, "%s", testFileData.strTest);


 
5. 파일을 읽어 구분자 분리후 저장
참고로 바이너리 파일같은 것을 읽을때도 이방식을 사용하면 됩니다.


p.s. 텍스트의 빈곳에 쓰레기 값이 들어간다면
memset( strTemp, 0x00, sizeof(strTemp));
요렇게 해서 먼저 초기화를 시킨후 사용하자!