2013-03-14 6 views
5

나는 개인적인 사용을위한 상당히 기본적인 프로그램을 작성하고 있지만, 좋은 습관을 사용하고 있는지 확인하고 싶다. 특히 나중에 좀 더 튼튼하게 만들면 더욱 그렇다.C의 파일 I/O에 대한 모범 사례는 무엇입니까?

프로그램은 인수로 일부 입력 파일을 받아들이고 파일에서 읽은 fopen()을 사용하여 열거 나 해당 정보로 처리 한 다음 출력을 하위 폴더에 몇 개의 다른 파일로 저장합니다. 프로그램이 ~/program에있는 경우 예는, 출력 파일은 내가 예를 output = fopen("./csv/output.csv", "w");의 파일에 직접 바로 출력 한 후 가까운 fclose(output);와 루프에 fprintf(output,"%f,%f", data1, data2);로 인쇄하고, ~/program/csv/

에 저장되고 난 그냥 느낌 그것은 나쁜 습관입니다.

필자는 임시 디렉토리에 파일을 쓰고 그 파일을 끝낼 때 옮겨야합니까? 고급 파일 I/O 라이브러리를 사용해야합니까? 나는 이것을 완전히 과소 평가하고 있는가?

+2

이 단순한 것을 위해, 나는 당신이 그것을 지나치게 생각한다고 생각합니다. 파일에 대한 유일한 프로세스 (또는 스레드) 인 경우 추가 작업이 필요 없습니다. –

+1

스택 오버플로에 오신 것을 환영합니다. 너무 오래 전에 [FAQ]를 읽어주십시오. 이는 정확한 대답이없는 질문 일 수 있습니다. 대부분의 경우, 당신이하는 일은 괜찮습니다. 임시 디렉토리는 아마도 과잉 공격 일 것입니다. 'fclose()'가 작동하는지 확인하고 싶을 것이다. 그렇지 않은 경우 파일이 올바르게 작성되지 않았다고 가정해야하며 아마도 파일을 제거해야합니다. 각 출력 작업을 검사 할 수 있습니다. 그것이 이론적으로 올바른 방법입니다. 분명히'fopen()'을 체크해야한다. –

답변

6

모범 사례 :

  • 확인 fopen의 모든 호출, 오류 등의 printf, 풋, fprintf와, FCLOSE
  • 사용 getchar가 당신이해야하는 경우 FREAD 당신이 할 수있는
  • 사용하는 경우 putchar 당신이해야하는 경우에 fwrite는 입력 라인 길이
  • 피하기 임의의 한계는 바이너리 모드에서 출력 파일을 열 필요가있을 때 알고
  • 을 (malloc에 ​​/ realloc을해야 할 수도 있습니다) 할 수있는 경우
  • 표준 C를 사용하십시오. conio를 잊으십시오.종종의 sillyness에 대처하기 위해 작성하는 마이티 윌리엄 H.에 의해 오도 것과 같은 printf ("hello, world\n");하지 "\nHello, world"입니다 즉 시간 :-)
  • 줄 바꿈이 아니라 텍스트의 시작 부분에 행의 에 속하는 명령 쉘.
  • 7 비트 이상의 ASCII가 필요한 경우 Unicode을 선택하십시오 (가장 일반적인 인코딩은 ASCII 호환 UTF-8입니다). 학습 할 필요가있는 마지막 인코딩입니다. 코드 페이지와 ISO-8859- *를 멀리하십시오.
+0

'getchar'과'putchar'이 "꼭해야한다면"사용해야 할 함수라고 말하는 이유는 무엇입니까? –

+0

기본적으로 큰 문자 I/O 대 문자 대 I/O를 선호합니다. {get, put} char()에 본질적으로 잘못된 것은 없습니다. 'cat'을 재 구현하면 문자 I/O를 사용하는 것이 분명히 차선책입니다. – Jens

3

나는 이것을 완전히 지나치게 생각하지 않습니까?

있습니다. 작업이 간단하다면 "전문적"이라고 느껴지므로 복잡한 솔루션을 목적에 맞게 사용하지 마십시오. 초보자인데 코드 가독성에 중점을두면 자신과 타인의 삶을 원활하게 해줍니다.

0

괜찮습니다. I/O는 기본적으로 stdio 파일 기능으로 완전히 버퍼링되므로, fprintf을 호출 할 때마다 파일에 쓰지 않습니다. 실제로 많은 경우에 fclose에 전화 할 때까지 아무 것도 쓰여지지 않습니다.

fopen의 반환을 확인하고 완료되면 파일을 닫는 것이 좋습니다. OS와 컴파일러가 이와 같은 간단한 프로그램을 위해 나머지를 효율적으로 만들 수있게하십시오.

0

추가 처리를 위해 ~/program/csv/output.csv이 있는지 확인하는 프로그램이 없다면 아무 일도하지 않아도됩니다.

그렇지 않은 경우 tmpfile in stdio.h 또는 유사한 라이브러리 호출을 호출하여 얻은 FILE *에 글을 쓰고, 완료되면 파일을 최종 대상에 복사 할 수 있습니다. 또한 잠금 파일 output.csv.lck을 내려 놓고 완료하면 제거 할 수 있지만 다른 프로그램의 동작을 수정할 수 있는지에 따라 다릅니다.

0

연습용으로 cat, cp, mv 프로그램을 만들 수 있습니다. 내 눈에