fstream 을 이용하여 파일로 부터 입력 출력 받는다

#include <fstream>

int main(void)
{

    fstream fstreams;       
   fstreams.open("text.txt")<< fstream 형 fstreams 선언하고 text.txt 파일 을 연다  (( 유사  ifstream 입력전용 파일 스트림
                                                                                                                       ofstream 출력전용 파일 스트림) 
// fstream fstreams.open("text.txt" , std::ios::in  (or)  std::ios::out) 전용스트림이 아닌 범용 fstream 을 열경우 뒤에
                                                         여는방식을 설정할수 있다 in은입력 out 은 출력 설정 
                                                          기타 여러 여는방식 지정 flag 인자들이 존재한다! 
    파일 열때의 인자들  |   or 연산으로 중복시킨다
std::      ios::banary  2진모드로 파일열기(기본은 텍스트 모드)
            ios::app 파일의 끝에 추가한다
            ios::ate 처음엔 파일의 끝에 추가되지만 그다음부턴 현재 위치에 추가된다
            ios::in 읽기모드로 연다
            ios::out 쓰기모드로 연다
            ios::trunc 이미 파일이 있는경우 내용을 삭제한다
            ios::nocreate 파일이 없으면 에러를 발생시킨다
            ios::noreplace 파일이 있는경우 에러를 발생한다

ifstream files("test.txt");
char arr[81];
char ch;

files >> arr;    // 파일로부터 한단어를 읽어들인다 공백문자를 만날때까지
files >> ch   // 파일로부터 char 형 한문자를 읽어들인다
ch = files.get(); 이하 동일
files.get(ch); 이하 동일

files.get(arr,80); 하나의 레코드가 80바이트 이하이면 \n을 만날때까지 읽고 아니면 80바이트를 모두 읽는다
files.getline(arr,80); 위와 동일하나 \n 문자를 읽지만 저장하지는 않는다

ofstream files2("text.txt");
files2 << arr ;



    

종료후
fstreams.close(); 호출한다

return 0;
}

<<<<<<<<<<파일로 부터 입력받아서 데이터 처리 >>>>>>>>>>>>
text.txt 파일에는
가나다 90 80 70
라마바 80 70 60
아자차 20 40 50
카타파 80 70 50 라는내용이 있다

#include <iostream>
#include <fstream>
#include <vector>  기타등등 인클루드 생략

using std::vector;
using std::ifstream;
//기타 using 생략

struct student{
 string name;
 int kor;
 int eng;
 int math;
 int sum;
 double average;
};

int main(void)
{
 vector<student> clas;  벡터 생성
 student insert;  //파일로 부터 입력받아서 push_back() 의 인자로 넘길 student 형 자료형

 ifstream infile;  //입력 파일 스트림 생성
 infile.open("test.txt"); //파일스트림 test.txt 열어서

 while(infile >> insert.name)  // 파일의 끝을 만날때까지 1번째 인자인 name 을 받고 (1번째 인자가 있다면 4번째 인자도 존재
 {                                        // 따라서 파일의 끝을 만난다면 1번째인자에서 ...
  infile >> insert.kor;  //2번째 인자 받고
  infile >> insert.eng; // 3번째 인자 받고
  infile >> insert.math; //4번째 인자 받고
  insert.sum = insert.kor+insert.eng +insert.math; //연산
  insert.average = (insert.sum* 1.0 )/3;
  clas.push_back(insert);  연산후 vector에 넣는다
 }

 
for(int i=0 ; i< (clas.size()) ; ++i)  // 출력부분
{
 cout << clas[i].name << " ";
 cout << clas[i].kor << " ";
 cout << clas[i].eng<< " ";
 cout << clas[i].math<< " ";
 cout << clas[i].sum<< " ";
 cout << clas[i].average<< " ";
 cout << endl;
}
 infile.close();  //파일스트림 클로즈
Sleep(5000);
 return 0;

}

결과
가나다 90 80 70 240 80
라마바 80 70 60 210 70
아자차 20 40 50 110 36.6666
카타파 80 70 50 200 66.6666

by rider | 2008/11/11 16:36 | C++ | 트랙백 | 덧글(0)

StringStream 사용 C에서의 버퍼로부터받아오는 fscanf 과 비슷

#include <string>
#include <sstream>
#include <iostream>

int main(void)
{
    std::string s("code name j");   // code name j 라는 문자열을 지닌 스트링 자료형을  생성
    std::string out;                      // 스트링 스트림으로 부터 입력받을 빈 스트링자료형 생성
    std::istringstream cstring(s); // 스트링 스트림 생성 code name j 라는 값을 가진 스트링으로 부터 스트림

    while(cstring >> out)  // code name j 라는 값을 가진 스트링으로 부터 한 단어씩 읽어온다
    {
        std::cout << out << std::endl;
    }

            //출력 결과는 
            code
            name
            j   가 될것이다!
}

<<<응용 >>  c++ 에는 strtok 를 string으로 사용하거나 java 의 split 같은 함수가 없다
따라서 공백을 기준으로 strtok 하고 싶을경우엔  이 stringstream 을 사용하여 읽어들이면 유용하다!!!

by rider | 2008/11/11 02:08 | C++ | 트랙백 | 덧글(0)

Stl

std::string>>>>>>>>>>>>>>>>>>>>>>
using std::string;

string a;
a.size();  << 이 객체의 사이즈 리턴  merong 이란 데이터가 담겨져 있다면 6 이리턴
a.c_str() << 널종료 배열을 가리키는 const char*를 리턴
a.data()  << a.c_str 과 유사하지만 널종료 배열이 아님
a,copy(p,n)  << a 로 부터 n개를 p로 복사


std::vector>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

using std::vector;
vector a;   <<vector 는 인덱스의 범위가 유효한지 체크하지 않는다!!

(멤버함수부분)
a.size();  << 이 벡터의 엘리먼트의 갯수 리턴
a.push_back(인자) << 이 벡터의 제일 끝 엘리먼트의 뒤에 인자 값 추가
a.begin(); << 이 벡터의 첫번째 엘리먼트의 주소 리턴
a.end(); <<이벡터의 마지막 엘리먼트다음의 주소 리턴(heap 상 존재불가)
a.clear()  << 이 벡터의 모든 내용을 비우고 빈 벡터로 초기화시킨다
a.empty() << a에 요소가 하나도 없는지 알려주는 함수
a.erase(지울 요소의 인덱스 <예>a.begin()+i  ) << 해당 요소를 벡터에서 제거한다  이제 a.begin()+i는 다음요소를 가리키고있다
            또는 a.erase(지울요소의 시작인덱스 ,  지울요소의 끝 인덱스 ) 다수를 지울수도 있다
a.insert(벡터의끝 <a.end()>, 뒤에 추가할 벡터의 시작 <b.begin()>, 뒤에 추가할 벡터의 끝, <b.end()>)
            a.insert 는 벡터의 끝에 벡터를 추가한다
a.reserve(n) n개의 공간을 담을수 있는 공간확보 하지만 초기화 하지 않는다. 반복적인 push_back() 이나 insert를 막기위해사용
a.resize(n) a의 사이즈를 n으로 만든다 n이 현재 v의 사이즈보다 작다면 n이하의 요소들은 vector에서 제거되고 n이 현재 사이즈
                보다 클경우엔 v의 타입에 적당한 값으로 초기화 된다

2차원 vector >>>>>
vector< vector<int> > arr;  <> 안의 벡터 인자를 띄우지 않고 붙이면 >> 연산으로 인식한다;
vector<int> element;
element.push_back() << vector 인자에 데이터를 넣은뒤

arr.push_back(element); 데이터 있는 벡터를 push_back() 인자로 상위 vector 에 전달하면 2차원 벡터 생성

std::list  >>>>>>>>>>>>>>>>>>>>( 통상적으로 vector 의 함수들과 동일 인덱스 연산  인덱싱 불가 랜덤엑세스 불가!)

std::map >>>>>>>>>>>>>>>>>>>>>>>>> 한쌍의 자료형 하나의 키값과 하나의 데이터 ( 데이터베이스에서 연상하면 된다)
    K는 키값 V는 value
<<<<<<<예제코드>>>>>>>>임의 작성
std::map<string, int> k;   // 스트링 키값 int 형을 지닌 맵 생성  <<  동적 자료형
string code="shit!!"  스트링에 값넣고
int k=22; 인트형에 값 넣고
k[code]=k;  맵에 데이터 넣고
k["merong"]=5; 맵에 데이터 넣음
이하의 코드에   cout<< k["merong"];   << 이코드 실행시 5가 출력
                      cout<< k[code] ; << 이 코드 실행시 22가 출력                      
<<<<<<<<<<<<예제코드 2>>>>>
   while( cin >> string형 자료형)
{
    ++k[string형자료형];       이 코드 사용시 cin에 입력할때마다 스트링형 자료형에 값이 들어가고 map형에 string형 자료형을 넣고 디폴트 생성된 0의 value 값을 하나씩 늘린다 이때!  전에 입력한 스트링과 같은 스트링일 경우에 새 맵에 같은 스트링이 
들어가지 않고 k[string]형에 접근하여 값만 ++ 시킨다  따라서 이 코드는 맵에 데이터를 입력 받되 같은 데이터가 들어오면 int값을
1개씩 늘려서 단어들의 갯수를 저장하는 int 형과 단어인 string 형을 보관하는 코드다
 }
      
map<K,V> m;  <<빈 맵 m을 선언
map<K,V> m(cmp) 새로운 빈 map 생성 이 맵은 const K타입의 키와 v타입의 값을 가지며 동작함수 cmp 를 사용하여 요소들의
        순서를 결정
map.count(key) << 주어진 키값의 갯수를 세어 리턴 // 통상적으로 키값은 고유한 값이므로 1이 리턴되므로 별 필요없다
m[k] K타입의 키 k를 사용하여 map을 인덱싱하고 , V타입의 lvalue를 리턴 만약 주어진 키에대한 요소가 없다면
       새로운 값지정 초기화된 요소가 생성되어 이 키를갖고 map에 삽입됨[]를 사용하여 map에 접근하면 새로운 요소를 생성할수
        있으므로 const map 에서는 []가 허용되지 않음
m.begin() 맵의 요소를 접근할때 사용하는 반복자 리턴
m.end()   //이하동
m.find(k) 키k에 대한 요소를 가리키는 반복자 리턴하거나 해당요소가 존재하지 않을경우엔 m.end() 리턴
map<K,V>와 그에 관련된 반복자 p에 대해서는 다음과 같은것이 적용

pair<string, int> <<<<<<<<<<<<<<<<쌍의 인자를 가지는 템플릿 자료구조
     p->first const K타입의 lvalue 를 얻을수있다 이 lvalue는 p가 가리키는 요소에 대한 키
     p->second V타입의 lvalue 를 얻을수 있다 이 lvalue는 p가 가리키는 요소에 값부분에 해당


[[[[[[[[[[[[[[[[[[[[[[[[유용한 함수]]]]]]]]]]]]]]]]
getline(기본istream&  즉 std::cin ,   2번째인자는 string 형) <<< 한 라인단위로 받아들인다!!!!!!!!!!!!!!!!!!!!!!!!
입력창에서  string code name j  라고 치게되면 통상적인 cin >> std::string 의 경우   string  만 출력되나 이 함수를 사용하면
                string code name j 가 다 std::string 에 입력되게 된다

#include <algorithm>

sort(시작주소, 끝주소 , 선택적인 인자 없을경우엔 < 연산자로 비교  있을경우엔 그 함수를 사용하여 비교)
        list.sort( 선택사항 >비교함수 ); 비교함수가 없을경우엔 < 연산자로 비교
        <vector 의 경우 sort 함수로 정열 할수있으나   list 의 경우  list에서만 동작하는 sort 함수를 멤버함수로 가진다!>
max (1 , 2)  1번 2번중 큰값 리턴   min ( max의 반대)
accumulate(시작,끝, 누적될값)  << 3번쨰 인자에 시작부터 끝까지 총 합계를 누적시킨다 <numeric>
find(b,e,t) b부터 e-1까지 t를 찾는다
find_if(b,e,p)b 부터 e-1까지 각 요소를 p동작함수에 테스트한다
search(b,e,b2,e2)b2,부터 e2-1 이 가리키는 시퀸스를 찾는다 (범위)
copy(b,e,d) b부터 e-1까지를 d에 복사
remove_copy(b,e,d,t) b부터 e-1의 값을 d에 복사하나 t와 같지 않은 값을 복사
remove_copy_if(b,e,d,p)b부터 e-1까지의 인자중 동작 함수 p가 실패하는 모든 요소들을  d에 복사
remove_if(b,e,p)b부터 e-1의 범위의 요소들중 동작함수 p가 false인 요소들을 그 범위의 제일 일부분에 위치하도록 컨테이너
        를 재배열한다 삭제되지 않은 요소의 하나지난 다음위치를 가리키는 반복자 리턴
remove(b,e,t) remove_if와 같지만 값 t와 비교하여 어느값을 유지할지를 결정
transform(b,e,d,f) << b부터e-1의 범위의 요소들에 대하여 함수f를 실행하여 f의 결과를 d에 저장
partition(b,e,p) b부터e-1의 범위의 요소들을 동작함수 p에 기반하여 분할 동작함수 true인 요소들은 컨테이너의 앞쪽에 위치
        하는 반복자를 리턴하며 동작함수가 false인 첫번째 요소들에 대한 반복자 리턴 모든 동작함수 true 라면 e를 리턴
stable_partition(b,e,d,f)각 분할 내 요소들의 입력순서를 그대로 유지

> 문자데이터를 다루는 유용한 함수 제공

isspace(c) c가 공백문자 라면 true 리턴
isalpha(c) c가 알파벳이라면 true 리턴
isdigit(c) c가 숫자라면 true리턴
isalnum(c) c가 알파벳이나 숫자라면 true 리턴
ispunct(c)c가구두점 문자라면 true
isupper(c)c가 대문자라면 true
islower(c)c가 소문자라면 true
toupper(c)c의 대문자를 리턴
tolower(c)c의 소문자를 리턴

#include <numeric>

accumulate(시작,끝, 누적될값)  3번쨰 인자에 시작부터 끝까지 총 합계를 누적시킨다

by rider | 2008/11/09 14:47 | C++ | 트랙백 | 덧글(0)

CreateFile ReadFile 등으로 파일다루기

CreateFile 함수는다음 개체들을 생성하거나 열고, 그 개체에 접근하는데 사용될 수 있는 핸들을 리턴한다;

  • files
  • pipes
  • mailslots
  • communications resources
  • disk devices (Windows NT only)
  • consoles
  • directories (open only)

HANDLE CreateFile(

 LPCTSTR lpFileName, // 파일의 이름에 대한 포인터

 DWORD dwDesiredAccess, // 접근(read-write) 모드

 DWORD dwShareMode, // 공유 모드

 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 속성에 대한포인터

 DWORD dwCreationDisposition, // 생성하는 방식

 DWORD dwFlagsAndAttributes, // 파일 속성

 HANDLE hTemplateFile // 복사하기 위한 속성을 가진 파일의 핸들

); 

Parameters

lpFileName
생성하거나 열기 위한 개체(file, pipe, mailslot, communications resource, disk device, console, or directory)의 이름을 지정하는 NULL 종료 문자열에 대한 포인터

만약 lpFileName이 경로라면, 기본적인 문자열 크기는 MAX_PATH로 제한된다. 이 한계는 CreateFile 함수가 경로를 분해하는 방식과 관련이 있다.

Windows NT: CreateFile 의 확장(W) 버전을 호출하거나 경로에 "\\?\"를 달아서(? prepending) MAX_PATH개보다 많은 문자를 경로로 사용할 수 있다. "\\?\"는 함수에 경로 분해(parsing)를 하지 말라고 통보한다. 이것은 32,000 개 정도의 유니코드 문자를 경로로 사용할 수 있게 해 준다. 그러나 경로의 각 컴포넌트들은 MAX_PATH 문자보다 많을 수 없다. 이 기법을 사용하기 위해서는 경로를 완전히 작성해야만 한다. 이것은 UNC 이름과 함께 작동하기도 한다. "\\?\"는 경로의 일부로서 무시된다. 예를 들어서 "\\?\C:\myworld\private"는 "C:\myworld\private"와 같이 처리되며, "\\?\UNC\tom_1\hotstuff\coolapps"는 "\\tom_1\hotstuff\coolapps"로 처리된다.

dwDesiredAccess
개체에 대한 접근 유형을 지정한다. 응용프로그램은 읽기 접근, 쓰기 접근, 읽기-쓰기 접근, 또는 장치 질의 접근(device query access)을 획득할 수 있다. 이 인자들은 다음값들의 조합일 수 있다.
ValueMeaning
0개체에 대한 장치 질의 접근을 지정한다. 응용프로그램은 장치에 접근하지 않고도 장치에 속성을 질의할 수 있다.
GENERIC_READ개체에 읽기 접근을 지정한다. 파일로부터 읽어들일 수 있으며, 파일 포인터는 이동될 수 있다. GENERIC_WRITE와 읽기-쓰기 접근을 위해 혼용된다.
GENERIC_WRITE개체에 대한 쓰기 접근을 지정한다. 파일로부터 읽어들일 수 있으며, 파일 포인터는 이동될 수 있다. GENERIC_READ와 읽기-쓰기 접근을 위해 혼용된다.

dwShareMode
개체가 공유될 수 있는 방식을 지정하는 비트 플래그를 설정한다. 만약 dwShareMode가 0이면, 이 개체는 공유될 수 없다. 핸들이 닫힐 때까지 그 개체에 대한 연속되는 열기 연산은 실패할 것이다.

개체를 공유하기 위해서는 다음 값들 중의 하나 이상에 대한 조합을 사용해야 한다:

ValueMeaning
FILE_SHARE_DELETEWindows NT: 삭제 접근이 요청되었을 때만 개체에 대한 연속되는 열기 연산이 성공할 것이다
FILE_SHARE_READ읽기 접근이 요청되었을 때만 개체에 대한 연속되는 열기 연산이 성공할 것이다
FILE_SHARE_WRITE쓰기 접근이 요청되었을 때만 개체에 대한 연속되는 열기 연산이 성공할 것이다

lpSecurityAttributes
자식 프로세스에 의해서 상속될 수 있는 반환 핸들이 무엇인지를 결정하는 SECURITY_ATTRIBUTES 구조체에 대한 포인터. 만약 lpSecurityAttributes가 NULL 이면, 그 핸들은 상속될 수 없다.

Windows NT: 이 구조체의 lpSecurityDescriptor 멤버는 개체에 대한 보안 기술자(security descriptor)를 지정한다. 만약 lpSecurityAttributes가 NULL 이면 개체는 기본 보안 기술자를 얻는다. 대상 파일 시스템이 반드시 파일과 디렉토리에 대한 보안을 지원해야지만, 이 인자는 파일에서 효력을 가질 수 있다.

dwCreationDisposition
파일이 존재할 때와 존재하지 않을 때 어떻게 해야할지를 지정한다. 이 인자에 대한 더 많은 정보를 원한다면, Remarks 섹션을 참조하라. 이 인자는 반드시 다음 값들 중의 하나여야만 한다:
ValueMeaning
CREATE_NEW새로운 파일을 생성한다. 지정된 파일이 이미 존재하면 이 함수는 실패한다.
CREATE_ALWAYS새로운 파일을 생성한다. 만약 그 파일이 존재하면, 함수는 파일을 덮어쓰고, 현존하는 속성을 초기화한다.
OPEN_EXISTING파일을 연다. 파일이 존재하지 않으면 함수는 실패한다.
콘솔(console)을 포함한 장치에 대해 CreateFile 함수를 사용하고 있을 때, OPEN_EXISTING 플래그를 사용해야만 하는 이유에 대한 논의를 위해서는 Remarks 섹션을 참조하라.
OPEN_ALWAYS만약 존재한다면 파일을 연다. 만약 파일이 존재하지 않으면, 함수는 마치 dwCreationDisposition이 CREATE_NEW였던 것처럼 새로운 파일을 생성한다.
TRUNCATE_EXISTING파일을 연다. 한번 열리면 그 파일은 끊어지고(truncated) 그것의 크기는 0 바이트가 된다. 그 호출 프로세스는 적어도 GENERIC_WRITE 접근과 함께 파일을 열어야만 한다. 함수는 파일이 존재하지 않을 때 실패한다.

dwFlagsAndAttributes
파일에 대한 파일 속성과 플래그를 지정한다.

FILE_ATTRIBUTE_NORMAL을 오버라이드하는 모든 파일을 제외하고는, 다음 속성중의 하나의 조합이 dwFlagsAndAttributes 인자를 위해 접근 가능하다(원문 : Any combination of the following attributes is acceptable for the dwFlagsAndAttributes parameter, except all other file attributes override FILE_ATTRIBUTE_NORMAL. )

AttributeMeaning
FILE_ATTRIBUTE_ARCHIVE파일은 압축(archive)되어야만 한다. 응용프로그램은 이 속성을 사용하여 백업이나 제거를 위해 파일에 표기(mark)한다.
FILE_ATTRIBUTE_HIDDEN파일은 숨겨져야 한다. 순차적인 디렉토리 열거(ordinary directory listing)에 포함되지 않는다.
FILE_ATTRIBUTE_NORMAL파일은 다른 속성 집합을 가지지 않는다. 이 속성은 혼자서 사용될(used alone) 때만 유효하다.
FILE_ATTRIBUTE_OFFLINE파일의 데이터를 즉시 이용할 수가 없다. 오프라인 저장소에 물리적으로 이동된 파일 데이터를 지정한다.
FILE_ATTRIBUTE_READONLY파일은 읽기 전용이다. 응용프로그램은 그 파일을 읽을 수 있으나, 읽거나 삭제할 수 없다.
FILE_ATTRIBUTE_SYSTEM파일은 운영체제의 일부이거나, 배타적으로 사용된다.
FILE_ATTRIBUTE_TEMPORARY임시 저장을 위해 사용되고 있는 파일이다. 파일 시스템은 데이터를 대량 저장소로 한 번에 보내는 것보다 더 빠른 접근을 위해 메모리의 데이터 모두를 유지하려고 시도한다.(원문 ; File systems attempt to keep all of the data in memory for quicker access rather than flushing the data back to mass storage.) 임시 파일은 더 이상 필요가 없어지면 응용프로그램에 의해 제거되어야만 한다.

다음 플래그들의 어떠한 조합이라도 dwFlagsAndAttributes 인자에 대해 이용 가능하다.

FlagMeaning
FILE_FLAG_WRITE_THROUGH
즉각적인 캐쉬를 통해서 쓰거나 직접 디스크로 갈 것을 시스템에 명령한다. 시스템은 여전히 쓰기 연산을 캐싱(역자주 : 빠른 연산을 위해 저장하는 기법 중 하나, cache)할 수 있지만, 그것들을 느리게 플러쉬(역자주 : 한꺼번에 이동시키는 것, flush)할 수는 없다.

원문 : Instructs the system to write through any intermediate cache and go directly to disk. The system can still cache write operations, but cannot lazily flush them.

FILE_FLAG_OVERLAPPED
시스템에 개체를 초기화할 것을 명령한다. 그래서 처리를 위해서 의미있는 시간을 취하는 연산은 ERROR_IO_PENING을 반환한다. 연산이 끝나면, 지정된 이벤트는 신호화된 상태(signaled state)로 설정된다.

원문 : Instructs the system to initialize the object, so that operations that take a significant amount of time to process return ERROR_IO_PENDING. When the operation is finished, the specified event is set to the signaled state.

FILE_FLAG_OVERLAPPE 를 지정했다면, 함수를 읽고 쓰는 파일은 반드시 OVERLAPPE 구조체를 지정해야만 한다. 즉, FILE_FLAG_OVERLAPPED가 지정되면, 응용프로그램은 중복된 읽기와 쓰기를 수행해야만 한다.

원문 : When you specify FILE_FLAG_OVERLAPPED, the file read and write functions must specify an OVERLAPPED structure. That is, when FILE_FLAG_OVERLAPPED is specified, an application must perform overlapped reading and writing.

FILE_FLAG_OVERLAPPED 가 지정되면, 시스템은 파일 포인터를 유지하지 않는다. 파일 위치는 반드시 lpOverlapped 인자의 일부로서 함수를 읽거나 쓰는 파일에 넘겨져야 한다.
이 플래그는 핸들에 유사하게 수행되는 하나 이상의 연산을 가능하게 한다(예를 들어, 유사한 읽기와 쓰기 연산)

원문 : This flag also enables more than one operation to be performed simultaneously with the handle (a simultaneous read and write operation, for example).

FILE_FLAG_NO_BUFFERING
명령어는 시스템에 즉각적인 버퍼링이나 캐싱을 수행하지 않고서 파일을 열것을 명령한다. FILE_FLAG_OVERLAPPED와 조합되면, 이 플래그는 최대한의 비동기 수행을 제공한다. 왜냐하면 I/O는 메모리 관리자가 동기화 연산에 의지하지 않기 때문이다. 그러나 어떠한 I/O 연산은 더 오래 걸릴 수 있다. 왜냐하면 데이터가 캐쉬에 저장되지 않기 때문이다.

FILE_FLAG_NO_BUFFERING으로 열린 파일로 작업하기 위해서 응용프로그램은 반드시 특정 요구를 만나야 한다.

  • 파일 접근은 반드시 볼륨(역자주 : 디스크 볼륨을 의미하는듯, volumes)의 섹터 크기의 정수형 배수인 파일 안의 바이트 오프셋에서 시작해야만 한다.(원문 : File access must begin at byte offsets within the file that are integer multiples of the volume's sector size.)
  • 파일 접근은 볼륨의 섹터 크기의 정수형 배수인 바이트 수를 지향해야 한다. 예를 들어 섹터의 크기가 512바이트라면, 응용프로그램은 512나 1024, 2048바이트를 읽거나 쓰겠다고 요청할 수 있다. 그러나 335나 981이나 7171바이트는 안 된다.
  • 읽기나 쓰기 연산을 위한 버퍼 주소는 섹터에 정렬되어야 한다(메모리에서 볼륨의 섹터 크기의 정수형 배수인 주소들의 정렬)(원문 : Buffer addresses for read and write operations must be sector aligned (aligned on addresses in memory that are integer multiples of the volume's sector size)).

볼륨의 섹터 크기의 정수형 배수로 버퍼를 정렬하는 한 가지 방법은 버퍼를 할당하기 위해서 VirtualAlloc를 사용하는 것이다. 그것은 운영체제의 메모리 페이지 크기의 정수형 배수인 주소로 정렬된 메모리를 할당한다. 메모리 페이지와 볼륨 섹터의 크기는 모두 2의 승수(power) 크기이기 때문에, 이 메모리는 볼륨의 섹터 크기의 정수형 배수인 주소로 정렬될 수도 있다.

응용프로그램은 GetDiskFreeSpace 함수를 호출함으로써 볼륨의 섹터 크기를 결정할 수 있다.

FILE_FLAG_RANDOM_ACCESS
불규칙하게 접근된 파일을 지정한다. 시스템은 이 플래그를 파일 캐싱을 최적화하기 위한 계기(hint)로 사용할 수 있다.
FILE_FLAG_SEQUENTIAL_SCAN
처음부터 끝까지 순차적으로 접근된 파일을 지정한다. 시스템은 이 플래그를 파일 캐싱을 최적화하는 계기로 사용할 수 있다. 만약 응용프로그램이 파일 포인터를 임의 접근을 위해 움직인다면, 최적의 캐싱이 일어나지 않을지도 모른다; 그러나 정확한 연산은 여전히 보장된다.
이 플래그를 지정하는 것은 응용프로그램이 큰 크기의 파일을 순차 접근을 사용해서 읽어들일때 수행성을 증가시킬 수 있다. 수행성 획득은 대부분 순차적인 큰 파일을 읽어들이는 응용프로그램에 대해서 더욱 중요하다. 그러나 가끔 작은 크기의 바이트를 건너 뛰는 경우가 있다.
FILE_FLAG_DELETE_ON_CLOSE

자신에 대한 모든 핸들이 닫힌 이후에 즉시 파일을 제거하라고 운영체제에 명령한다. FILE_FLAG_DELETE_ON_CLOSE라고 지정한 파일 핸들을 제거하라는 것은 아니다.

그 파일에 대한 연속되는 열기 요청은 FILE_SHARE_DELETE가 사용되지 않으면 실패할 것이다.

원문 : Indicates that the operating system is to delete the file immediately after all of its handles have been closed, not just the handle for which you specified FILE_FLAG_DELETE_ON_CLOSE.

Subsequent open requests for the file will fail, unless FILE_SHARE_DELETE is used.

FILE_FLAG_BACKUP_SEMANTICS
Windows NT: 파일이 백업이나 재저장 연산을 위해 열리거나 생성되어야 한다고 명령한다. 운영체제는 호출 프로세스가 필요한 권한을 가지는 파일 보안 체크를 재정의하게 한다. 적절한 권한은 SE_BACKUP_NAME과 SE_RESTORE_NAME이다.

이 플래그를 설정해서 디렉토리의 핸들을 획득할 수도 있다. 디렉토리 핸들은 파일 핸들을 대신해 특정 Win32 함수에 넘겨질 수 있다.

원문 : Indicates that the file is being opened or created for a backup or restore operation. The system ensures that the calling process overrides file security checks, provided it has the necessary privileges. The relevant privileges are SE_BACKUP_NAME and SE_RESTORE_NAME.

You can also set this flag to obtain a handle to a directory. A directory handle can be passed to some Win32 functions in place of a file handle.

FILE_FLAG_POSIX_SEMANTICS
파일이 POSIX 규칙을 적용해 접근될 수 있도록 명령한다. This includes allowing multiple files with names, differing only in case, for file systems that support such naming. 이 옵션을 사용할 때는 주의를 기울여야 하는데, 이 플래그로 생성된 파일은 MS-DOS나 16비트 윈도우에서 작성된 응용프로그램을 통해서는 접근하지 못할 수도 있기 때문이다.
FILE_FLAG_OPEN_REPARSE_POINT

이 플래그를 지정하면 NTFS 분석 포인트(NTFS reparse points)의 분석 동작(reparse behavior)을 방해한다. 파일이 열릴 때, 분석 포인트를 제어하는 필터가 선택적이든 필수적이든간에  파일 핸들이 반환된다. 이 플래그는 CREATE_ALWAYS 플래그와 함께 사용될 수 없다.

원문 : Specifying this flag inhibits the reparse behavior of NTFS reparse points. When the file is opened, a file handle is returned, whether the filter that controls the reparse point is operational or not. This flag cannot be used with the CREATE_ALWAYS flag.

FILE_FLAG_OPEN_NO_RECALL
파일 데이터가 요청되지만, 원격 저장소에 계속 저장되어야만 함을 지시한다. 로컬 저장소로 다시 이동될 수는 없다. 이 플래그는 원격 저장소 시스템(remote sotrage system)이나 계층 저장 관리 시스템(Hierarchical Storage Management system)에 의해 사용된다.

만약 CreateFile이 클라이언트 측의 named pipe를 열면, dwFlagsAndAttributes 인자는 Security Quality of Service 정보를 포함할 수도 있다. 더 많은 정보를 원한다면 Impersonation Levels를 참조하라. SECURITY_SQOS_PRESENT 플래그를 지정하는 응용프로그램을 호출할 때, dwFlagsAndAttributes 인자는 다음 값 중 하나 이상을 포함할 수 있다:

ValueMeaning
SECURITY_ANONYMOUS클라이언트를 Anonymous(익명) impoersonation level로 흉내내라고 지정한다.

원문 : Specifies to impersonate the client at the Anonymous impersonation level.

SECURITY_IDENTIFICATION클라이언트를 Identification(증명) impersonation level로 흉내내라고 지정한다.

원문 : Specifies to impersonate the client at the Identification impersonation level.

SECURITY_IMPERSONATION클라이언트를 Impersonation(대역) impersonation level로 흉내내라고 지정한다.

원문 : Specifies to impersonate the client at the Impersonation impersonation level.

SECURITY_DELEGATION클라이언트를 Delegation(대표) impersonation level로 흉내내라고 지정한다.

원문 : Specifies to impersonate the client at the Delegation impersonation level.

SECURITY_CONTEXT_TRACKING보안 추적 모드(Security Tracking Mode)가 동적(dynamic)임을 지정한다. 만약 이 플래그가 지정되어 있지 않으면, 보안 추적 모드는 정적이다.
SECURITY_EFFECTIVE_ONLY클라이언트 보안 문맥(context)의 가능한 양상(aspect)만을 서버에 지정한다. 만약 이 플래그를 지정하지 않으면, 모든 클라이언트 보안 문맥의 양상이 이용가능해진다.

이 플래그는 서버가 클라이언트를 흉내내고 있는 동안 사용할 수 있는 그룹과 권한을 클라이언트가 제한할 수 있도록 허용한다.

원문 : Specifies that only the enabled aspects of the client's security context are available to the server. If you do not specify this flag, all aspects of the client's security context are available.

This flag allows the client to limit the groups and privileges that a server can use while impersonating the client.


hTemplateFile
템플릿 파일에 대해 GENERIC_READ 접근을 가지는 핸들을 지정한다. 템플릿 파일은 생성되고 잇는 파일에 대한 파일 속성과 확장 속성을 제공한다.

Windows 95: hTemplateFile 인자는 NULL이어야만 한다. 만약 핸들을 제공하면, 호출은 실패하고 GetLastError은 ERROR_NOT_SUPPORTED를 반환한다.

Return Values

함수가 성공하면 리턴값은 파일을 지정한 열기 핸들이다. 지정된 파일이 함수 호출 이전에 존재하고, dwCreationDisposition이 CREATE_ALWATS이거나 OPEN_ALWAYS이면, GetLastError 호출은 (함수가 성공했더라도) ERROR_ALREADY_EXISTS를 리턴한다. 만약 파일이 호출 이전에 존재하지 않으면 GetLastError은 0을 리턴한다.

만약 함수가 실패하면 리턴값은 INVALID_HANDLE_VALUE이다. 확장 에러 정보를 원하면 GetLastError를 호출한다.

Remarks

CloseHandle 함수를 사용하여 Createfile에 의해 반환되는 개체 핸들을 닫는다.

위에 기록된 것처럼. dwDesiredAcdess에 대해 0을 지정하는 것은 응용프로그램이 장치에 실제적으로 접근하지 않고도 장치 속성을 질의할 수 있도록 허용한다. 예를 들어서 응용프로그램이 플로피 디스크 장치의 크기나 그것이 지원하는 포맷을 드라이브의 플로피를 가지지 않고도 결정하고자 할 때, 이러한 유형의 질의가 유용하다.

Files

새로운 파일을 생성할 때, CreateFile 함수는 다음의 동작을 수행한다:

  • 파일 속성과 FILE_ATTRIBUTE_ARCHIVE와 함께 dwFlagsAndAttributes에 의해 지정된 플래그를 조합한다.
  • 파일 길이를 0으로 설정한다.
  • hTemplateFile 인자가 지정되면 템플릿 파일에 의해 제공되는 확장된 속성을 새로운 파일로 복사한다.

존재하는 파일을 열 때, CreateFile은 다음 동작을 수행한다:

  • 존재하는 파일 속성과 함께 dwFlagsAndAttributes에 의해 지정된 파일 플래그를 조합한다. CreateFile은 dwFlagsAndAttributes에 의해 지정된 파일 속성을 무시한다.
  • 파일 길이를 dwCreationDisposition의 값에 의거해 설정한다.
  • hTemplateFile 인자를 무시한다.
  • 만약 lpSecurityAttributes 인자가 NULL이 아니면, SECURITY_ATTRIBUTES 구조체의 lpSecurityDescriptor 멤버를 무시한다. 다른 구조체 멤버는 사용된다. 파일 핸들이 어떤 것인지 식별하기 위한 방식일 뿐인 bInheritHandle 멤버는 상속될 수 있다.

만약 플로피 디스크를 가지고 있지 않은 플로피 드라이버나, CD를 가지고 있지 않은 CD-ROM 드라이브에서 파일을 생성하려고 시도하면, 시스템은 사용자에게 디스크나 CD를 삽입하라고 요구하는 메시지 박스를 디스플레이한다. 이 메시지 박스를 디스플레이하지 않게 하기 위해서는, SetErrorMode 함수를 SEM_FAILCRITICALERRORS로 호출한다.

Windows NT: NTFS같은 정 파일 시스템에서는 개별 파일과 디렉토리를 위한 압축(compression)과 암호화(encryption)를 제공한다. 그러한 파일 시스템으로 포맷된 볼륨에서는 새로운 파일이 그 디렉토리의 압축과 암호화 속성을 상속한다.

CreateFile 함수를 사용하여 파일의 압축과 암호화 상태를 설정할 수는 없다. DeviceIoControl 함수를 사용하여 파일의 압축 상태를 설정하고, EncryptFile 함수를 사용하여 암호화 상태를 설정한다.

Pipes

CreateFile이 클라이언트의 named pipe를 열면, 함수는 listening state 안에 존재하는 named pipe의 인스턴스를 사용한다. 열기 프로세스는 요구되는 것보다 여러번 핸들을 중복할 수 있다. 그러나 한 번 열리면 named pipe 인스턴스는 다른 클라이언트에 의해 열릴 수 없다. pipe가 열려질 때 지정된 접근은 반드시 CreateNamedPipe 함수의 dwOpenMode 인자에 지정된 접근과 호환되어야만 한다. pipe에 대한 더 많은 정보를 원한다면 Pipes를 참조하라.

Mailslots

CreateFile이 클라이언트의 mailslot을 열면, 함수는 CreateMailSlot 함수로 mailslot 서버가 생성되기 이전에 mailslot 클라이언트가 로컬 mailslot을 열려고 시도하면  INVALLID_HANDLE_VALUE를 리턴한다. mailslot에 대한 더 많은 정보를 원한다면 Mailslots를 참조하라.

Communications Resources

CreateFile함수는 시리얼 포트 COM1과 같은 communications resource에 대한 핸들을 생성할 수 있다. coummunications resources에 대해 dwCreationDisposition 인자는 반드시 OPEN_EXISTING이어야만 하며, hTemplate 인자는 반드시 NULL이어야만 한다. 읽기, 쓰기, 또는 읽기-쓰기 접근이 저장될 수 있고, 핸들은 중복된 I/O를 위해 열릴 수 있다. communications에 대한 더 많은 정보를 원한다면 Communications를 참조하라.

Disk Devices

Windows NT: CreateFile함수를 사용해서 디스크 드라이버나 디스크 드라이브의 파티션을 열 수 있다. 이 함수는 디스크 장치의 핸들을 리턴한다; 그 핸들은 DeviceIOControl 함수에 의해 사용될 수 있다. 그렇나 호출이 성공하기 위해서는 다음과 같은 요구를 만족해야 한다.

  • 호출자는 하드 디스크 드라이버에 대한 연산을 성공하기 위해 운영자 권한을 가지고 있어야만 한다.
  • lpFileName 문자열은 \\.\PHYSICALDRIVEx 형식이어야만, 하드 디스크 x를 열 수 있다. 하드 디스크 번호는 0에서 시작한다. 예를 들어:
StringMeaning
\\.\PHYSICALDRIVE2사용자 컴퓨터의 세번째 물리적 드라이브의 핸들을 획득한다.

  • lpFileName 문자열은 \\.\x 여야만 한다. 플로피 드라이브 x 를 열기위해서나 하드디스크의 파티션 x를 열기 위해서이다. 예를 들어 :
StringMeaning
\\.\A:사용자 컴퓨터의 드라이브 A의 핸들을 획득
\\.\C:사용자 컴퓨터의 드라이브 C의 핸들을 획득

디스크 장치가 FILE_FLAG_NO_BUFFERING 플래그로 열리지 않았다고 해도 모든 I/O 버퍼는 반드시 섹터로 정렬(메모리에서 볼륨의 섹터 크기의 정수형 배수로 주소가 정렬됨)된다는 점에 주의하라.

Windows 95: 이 기법은 논리적 드라이브를 열기 위해서는 작동하지 않는다. Windows 95에서는 지정된 형식의 문자열이 CreateFile로 하여금 에러를 발생시키도록 한다.

  • dwCreationDisposition 인자는 반드시 OPEN_EXISTING 값을 가져야 한다.
  • 플로피 디스크를 열 때나 하드 디스크의 파티션을 열 때는, 반드시 FILE_SHARE_WRITE 플래그를 dwShareMode인자에 설정해야만 한다.

Consoles

CreateFile 함수는 콘솔 입력(CONIN$)에 대한 핸들을 생성할 수 있다. 만약 프로세스가 상속이나 중복에 대한 결과로서 그것에 대한 열려진 핸들을 가진다면, 그것은 활성화된(active) 스크린 버퍼(CONOUT$)에 대한 핸들을 생성할 수도 있다. 호출 프로세스는 반드시 상속된 콘솔이나 AllocConsole 함수에 의해 할당된 것들 중 하나와 연결되어야 한다. 콘솔 핸들을 위해서 CreateFile 인자를 다음과 같이 설정한다:

ParametersValue
lpFileNameCONIN$ 값을 사용해 콘솔 입력을 지정하고 CONOUT$ 값을 사용해 콘솔 출력을 지정한다
SetStdHandle 함수가 표준 입력 핸들로 재지정(redirected)되었다고 할지라도, CONIN$은 콘솔의 입력 버퍼 핸들을 얻는다. 표준 입력 핸들을 얻기 위해서는 GetStdHandle 함수를 사용한다.
SetStdHanle 함수가 표준 출력 핸들을 재재정했다고 하더라도, CONOUT$은 활성화된 스크린 버퍼에 대한 핸들을 얻는다. 표준 출력 핸들을 얻기 위해서는 GetStdHandle함수를 사용한다.
dwDesiredAccessGENERIC_READ | GENERIC_WRITE 가 is 우선권이 있지만, 어느것 하나가 접근을 제한 할 수 있다.

원문 : GENERIC_READ | GENERIC_WRITE is preferred, but either one can limit access.

dwShareMode만약 호출 프로세스가 콘솔을 상송하거나 자식 프로세스가 콘솔에 접근할 수 있다면, 이 인자는 FILE_SHARE_READ | FILE_SHARE_WRITE여야만 한다.
lpSecurityAttributes만약 콘솔이 상속되기 원한다면, SECURITY_ATTRIBUTES구조체의 bInheritHandle 멤버가 TRUE여야만 한다.
dwCreationDispositionCreateFile을 사용하여 콘솔을 열 때, OPEN_EXISTING을 지정해야만 한다.
dwFlagsAndAttributes무시됨
hTemplateFile무시됨

다음의 리스트는 fwdAccess와 lpFileName의 다양한 설정의 효과를 보여준다.

lpFileNamefwdAccessResult
CONGENERIC_READ입력을 위해 콘솔을 연다
CONGENERIC_WRITE출력을 위해 콘솔을 연다
CONGENERIC_READ\
GENERIC_WRITE
Windows 95: CreateFile이 실패한다; GetLastError을 ERROR_PATH_NO_FOUND를 리턴한다

Windows NT: CreateFile이 실패한다; GetLastError은 ERROR_FILE_NOT_FOUND를 리턴한다


Directories

응용프로그램은 CreateFile로 디렉토리를 생성할 수 없다; CreateDirectory나 CreateDirectoryEx를 호출해서 디렉토릴를 생성해야만 한다.

Windows NT: FILE_FLAG_BACKUP_SEMANTICS플래그를 설정함으로써 디렉토리의 핸들을 획득할 수 있다. 디렉토리 핸들은 파일 핸들 대신에 특정 Win32 함수로 넘겨질 수 있다.

NTFS와 같은 어떤 파일 시스템에서는 개별 파일과 디렉토리에 대한 압축과 암호화를 제공한다. 그러한 파일 시스템을 위해 포맷된 볼륨에서 새로운 디렉토리는 부모 디렉토리의 압축과 암호화를 상속한다.

CreateFile 함수를 사용하여 디렉토리의 압축과 암호화 상태를 설정할 수 없다. DeviceIoControl 함수를 사용하여 디렉토리의 압축 상태를 설정한다. EncryptFile 함수를 사용하여 디렉토리의 암호화 상태를 설정한다.

Windows CE: Windows CE 는 특별한 디바이스 파일 명을 사용하여 말단(peripheral) 장치에 접근한다. 이러한 이름들의 포맷에 대한 정보를 원한다면 Windows CE Device Driver Kit 문서를 참조하라.

lpSecurityAttributes 인자는 무시되며 NULL로 설정되어야만 한다.

dwFlagsAndAttributes 인자에 대해 다음 속성 플래그들은 지원되지 않는다 :

FILE_ATTRIBUTE_OFFLINE

FILE_ATTRIBUTE_TEMPORARY

dwFlagsAndAttributes인자에 대해 다음 파일 플래그들은 지원되지 않는다:

FILE_FLAG_OVERLAPPED 그러나 한번에 한 디바이스에서 다중 읽기/쓰기 펜딩(pending)은 허용된다

FILE_FLAG_SEQUENTIAL_SCAN

FILE_FLAG_NO_BUFFERING

FILE_FLAG_DELETE_ON_CLOSE

FILE_FLAG_BACKUP_SEMANTICS

FILE_FLAG_POSIX_SEMANTICS

dwFlagsAndAttributes 인자는 SECURITY_SQOS_PRESENT 플래그나 그것과 관련된 값을 지원하지 않는다

hTemplateFile 인자는 무시되며, 결과적으로 CreateFile은 새로운 파일의 확장된 속성을 복사하지 않는다

QuickInfo

  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.
  Unicode: Implemented as Unicode and ANSI versions on Windows NT.


ReadFile 함수의 사용법
Bool ReadFile(1,2,3,4,5);

첫번째 인수 :첫번째 인수는 데이터를 읽을 대상의 핸들이다 CreateFile 로 만들어진 핸들을 넣는다

 

두번째 인수 :읽을 데이터를 저장할 버퍼 이다

 

세번째 인수: 읽고자 하는 양이다 세번째인수는 당연히 두번째 보다 커야한다 만약 더 적으면

읽고자 하는 양만큼만 저장된다

 

네번째 인수: 실제로 읽혀지는 양이 저장된다

 

다섯번째 인수:비동기 입출력을 할때 사용된다 통상 NULL;

by rider | 2008/11/08 17:48 | API | 트랙백 | 덧글(0)

C++의 함수인자 전달 차이

3가지 인자전달법
call of reference 를 전달하는것   (이경우에는 임시객체로 넘기는것은 오류를 나타낸다) 즉 lvalue 여야 한다는 말이다
const reference 를 전달하는것
값을 복사하는 call of value

by rider | 2008/11/06 15:26 | C++ | 트랙백 | 덧글(0)

<< 이전 페이지다음 페이지 >>