Programming/Win_API2012. 9. 3. 23:13

 


 

CreateFile()

WriteFile()

ReadFile()

 


 

 

- CreateFile() : 파일 오픈

 

 

 

 

- WriteFile() : 파일에 쓰기

- ReadFile() : 파일 읽기

 

 

 

ex)

 

#include <Windows.h>
#include <stdio.h>
#include <string.h>

 

int main()
{
 HANDLE hFile;
 DWORD dwWrite, dwRead;
 char wdata[20] = "Hello World";
 char rdata[20];

 

 hFile = CreateFile(TEXT("test.txt"),GENERIC_READ|GENERIC_WRITE,0  ,NULL,CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL,NULL);

 

 if(hFile == INVALID_HANDLE_VALUE)
   return 0;

 

 WriteFile(hFile, wdata, strlen(wdata), &dwWrite, NULL);
 ReadFile(hFile, rdata, dwWrite, &dwRead, NULL);

 CloseHandle(hFile);

 printf("%s",rdata);

 

}

 

위와 같이 예제를 실행 해보면 ReadFile에서 rdata 버퍼 시작점에서 read하지 않고 뒷부분부터 read해서 아래와 같이 이상한 결과가 나왔다. 무슨 문제인지 ..........

 

 

 

 

 

Posted by bbolmin

댓글을 달아 주세요

  1. .

    파일함수에는 파일포인터가 존재하구요... 일종의 커서 비슷하게 생각하면 되요.
    WriteFile시에 파일포인터가 기록한 다름 부분으로 이동하기 때문에
    뒷부분을 읽어버린거에요.

    SetFilePointer나 SetFilePointerEx로 파일포인터를 시작부분으로 옮겨줘야 될거에요.

    2014.07.12 13:27 [ ADDR : EDIT/ DEL : REPLY ]
    • 안녕하세요

      한 가지 문의 드려요. createPipe 2개 만들어서 총 핸들 4(i,j,k,p)개. A pipe의 iHandle은 readFile만, (A.j writeHandle 닫고), B pipe의 kHandle은 write만, (B.p read 닫고) 해준 후, write/read 로 통신하는데 읽어오는 readBuf 문자 개수가 짧을 때는 정상적으로 읽혀지는데, readBuf 로 읽히는 개수가 클(약 3600개 이상) 경우에는 같은 프로그램 소스 코드 인데도 1. 중간중간 문자가 잘려서 읽어올 때도 있고, 2. 앞부분 문자는 못 읽어오고 중간부터 맨 마지막 부분만 읽어오는 경우가 있습니다. readBuf 사이즈를 늘려도 똑같네요.. 통신 구조가 100개 정도의 값을 쓰고 읽고를 반복한 뒤에 최종적으로 모든 결과를 읽어오기 때문에 처음에 만들었던 createpipe handle을 전역변수로 선언하여 통신을 합니다. read/writeFile 비동기방식, readFile 스레드방식 등으로 해도 증상이 같네요.
      감사합니다

      2018.08.11 20:56 신고 [ ADDR : EDIT/ DEL ]
  2. 안녕하세요 혹시 해결 하셨나요?
    저도 쓰레기값은 memset 으로 초기화 해줘서 해결 했는데 문자열이 잘려서 오는 경우는 없으셨나요?

    2018.08.11 20:57 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 글 본문에 문제는 SetFilePointer를 안해줘서 그런게 맞고 ;; 댓글에 언급하신 pipe문제는 이 내용과는 상관 없어보이네요. 댓글 내용만 봐서는 정확한 프로그램 구조를 모르겠는데 아마 스레드 동기화 문제일 것 같네요 ... (아니면 pipe buffer size limit 문제일 수도?)

      2018.08.16 11:04 신고 [ ADDR : EDIT/ DEL ]