2016-07-11 3 views
1

C 언어를 사용하여 데이터베이스 플랫 파일 프로젝트를 작성 중입니다. 나는 구성원이 거의없는 구조를 만들었습니다. 나는 데이터를 가져 오기 위해 fwrite()를 바이너리 파일과 fread()로 사용하고있다. 내 두 가지 주요 질문fread() 및 fwrite가 C 프로그래밍에서 작동하는 방법

첫째 우리는 텍스트 파일에 구조를 쓸 수 있습니까? 나는 좋은 모범을 보지 못했다. 텍스트 형식으로 작성하는 것이 실제로 잘못 되었습니까? "wb"대신 "w"를 사용하여 글을 쓸 때 텍스트 형식을 얻지 만 추가 단어가 있습니다.

두 번째 어떻게 fread() & fwrite가 작동하는지(). 그들은 데이터 블록에서 다음 블록의 주소를 얻는 방법을 조작합니다. 우리가 포인터를 가지고 있지만 파일에 나던 어떤 어드레스가 있어도 포인터가 다음 블록으로가는 방법은 무엇입니까?

+0

아니요, 파일이 바이너리 모드로 열려 있지 않으면 이진 구조를 읽거나 쓸 수 없습니다. 분명히 파일 시스템이 작동하는 방법과 OS API가 파일 시스템에 액세스하는 방법에 대한 연구를해야합니다. 이는 실제 파일 액세스를 위해 OS에 위임 한'fread()'/'fwrite()'구현의 범위를 벗어납니다. –

+0

입력에 대한 감사합니다 :) fgets/fputs를 사용해야합니까? 텍스트 형식으로 쓰려면 – ekaf

+0

데이터에 무작위로 접근하려면'fread/fwrite'를 구현하십시오 (그러나 구조체에 포인터가 포함되어 있으면 잘못 될 것입니다). 'fprintf/fgets'와'sscanf'를 사용하여 전체 데이터 세트를 읽고, 처리하고, 파일을 다시 쓰려면 텍스트가 좋습니다. 바이너리 레코드로 저장된 데이터는 종종 이식 가능하지 않으며, 프로그램이 중단되면 파일 된 데이터는 쓸모가 없다. 텍스트 파일은 사람이 읽을 수있는 반면, 다른 프로그램에 데이터를 읽는 새로운 기능을 작성하는 것이 훨씬 쉽습니다. 나는 클라이언트가 데이터 파일이 CSV 형식의 스프레드 시트와 호환되어야한다고 주장한 프로젝트에서도 작업했습니다. –

답변

1

첫 번째 구조는 텍스트 파일로 작성할 수 있습니까? 내가 대신 "W"를 사용 을 쓸 때 내가? 좋은 예 이 실질적으로 잘못된 텍스트 형식으로 작성하는 .is는 없다 보았다 "WB는"내가 텍스트 형식을 얻을 수 있지만, 몇 가지 추가 단어

상상 구조체 내부에 정수가 포함되어 있습니다. 이제 fwrite을 사용하여 작성하면이 정수는 파일 형식으로 이진 형식으로 작성됩니다. 이것을 텍스트로 해석하려고하면이 기능이 작동하지 않습니다. 텍스트 편집기는 이진 값을 문자로 해석하려고 시도합니다. 예상대로 작동하지 않을 가능성이 높습니다.

당신의 구조가 정수 3을 포함하는 경우 fwrite를 사용하여 작성하는 경우, 그것은 큰 엔디안 표기법을 가정

00000000 0000000 0000000 00000011 (3 in binary) 

로 저장됩니다. 이제 텍스트 편집기를 사용하여 위에서 읽으려고한다면 물론 원하는 효과를 얻지 못할 것입니다.

컴파일러에서 구조에 삽입 할 수있는 패딩 바이트에 대해서는 아무 것도 언급하지 않았습니다.

두 번째 어떻게 fread() & fwrite가 작동하는지(). 그들은 블록의 블록에서 다음 블록의 주소를 얻는 방법으로 작동합니다. 우리는 포인터를 가지고 있지만 파일에 아무런 주소가 없으므로 포인터가 다음 블록으로가는 것을 의미합니다. 블록?

이것은 주로 OS를 사용하여 처리됩니다.

추신. 직렬화에 대한 자세한 내용을 읽고 텍스트와 이진 파일의 차이점을 이해하는 것이 좋습니다.

+0

내가 그런 파일에서 직원의 세부 정보를 가져 와서 일부 reportgeneration에 대한 텍스트로 파일에 쓰기를 원한다면. fread와 frite를 사용하여 전체 구조체를 작성하거나 구조체의 개별 구성원을 하나씩 작성하십시오. – ekaf

+0

@ ekaf는 바이너리 데이터의 경우 fwrite/fread를 사용하고 텍스트 데이터의 경우 텍스트 함수를 사용합니다. 직렬화에 대한 자세한 내용을 읽어보십시오 –

+0

감사합니다 :) 도움 :) – ekaf

관련 문제