2013-03-14 15 views
5

Piszę dość podstawowy program do użytku osobistego, ale naprawdę chcę się upewnić, że korzystam z dobrych praktyk, szczególnie jeśli zdecyduję się na późniejszą poprawę.Jakie są najlepsze praktyki dla plików we/wy w C?

Do wszystkich celów i programów program akceptuje niektóre pliki wejściowe jako argumenty, otwiera je przy użyciu fopen() odczytu z plików, robi rzeczy z tymi informacjami, a następnie zapisuje wynik jako kilka różnych plików w podfolderze. na przykład, jeśli program jest ~/program następnie pliki wyjściowe są zapisywane w ~/program/csv/

Właśnie wyjście bezpośrednio do plików, na przykład output = fopen("./csv/output.csv", "w");, na niej drukować z fprintf(output,"%f,%f", data1, data2); w pętli, a następnie zamknij z fclose(output); a ja po prostu czuję to jest zła praktyka.

Czy powinienem zapisywać go w katalogu tymczasowym, do którego jest on zapisywany, a następnie przesuwać go po zakończeniu? Czy powinienem używać bardziej zaawansowanych bibliotek plików i/o? Czy całkowicie nad tym zastanawiam?

+2

Za coś tak prostego, myślę, że nad nim zastanawiasz. Jeśli jesteś jedynym procesem (lub wątkiem) zapisującym do pliku (ów), nie ma potrzeby dodatkowej pracy. –

+1

Witamy w przepełnieniu stosu. Proszę przeczytać [FAQ] przed zbyt długo. To może być pytanie bez precyzyjnej odpowiedzi. W większości przypadków to, co robisz, jest w porządku. Katalog tymczasowy jest prawdopodobnie przesadą. Możesz chcieć sprawdzić, czy 'fclose()' działa; jeśli nie, musisz założyć, że plik nie został utworzony poprawnie i prawdopodobnie powinien go usunąć. Możesz chcieć sprawdzić każdą operację wyjściową; to teoretycznie poprawny sposób na zrobienie tego. Oczywiście, musisz sprawdzić 'fopen()' od czasu awarii, jeśli tego nie zrobisz. –

Odpowiedz

6

Najlepsze praktyki w moich oczach:

  • Sprawdź każde wywołanie fopen, printf, stawia, fprintf, fclose itp błędów
  • użycie getchar, jeśli trzeba, fread jeśli możesz
  • wykorzystanie putchar jeśli trzeba, fwrite jeśli można
  • uniknąć arbitralnych ograniczeń długości linii zasilającej (może wymagać malloc/realloc)
  • wiedzieć, kiedy trzeba otworzyć pliki wyjściowe w trybie binarnym
  • użyj Standard C, zapomnij conio.h :-)
  • nowe linie należą na koniec linii, a nie na początku jakiegoś tekstu, czyli jest printf ("hello, world\n"); i nie "\nHello, world" jak te wprowadzają w błąd przez Mighty William H. często piszą do radzenia sobie z sillyness z ich powłoki poleceń.
  • jeśli potrzebujesz więcej niż 7bit ASCII, wybierz Unicode (najczęstszym kodowaniem jest UTF-8 zgodny z ASCII). To ostatnie kodowanie, jakiego kiedykolwiek będziesz potrzebować. Trzymaj się z dala od stron kodowych i ISO-8859- *.
+0

Czy mogę zapytać, dlaczego mówisz, że 'getchar' i' putchar' są funkcjami, które mają być użyte tylko "jeśli musimy"? –

+0

Zasadniczo jest to po prostu preferowana operacja wejścia/wyjścia dużej porcji w porównaniu z we/wy typu po znaku. Nie ma nic nie w porządku z {get, put} char(). Jeśli ponownie zastosujesz 'cat', użycie znaków I/O jest oczywiście nieoptymalne. – Jens

3

Czy całkowicie nad tym zastanawiam?

Jesteś. Jeśli zadanie jest proste, nie rób skomplikowanego rozwiązania celowo, tylko dlatego, że czujesz się "bardziej profesjonalnie". Chociaż jesteś początkującym, koncentrując się na czytelności kodu, ułatwi to życie twojego i innych.

0

W porządku. Domyślnie I/O jest w pełni buforowany z funkcjami pliku stdio, więc nie będziesz zapisywać do pliku przy każdym wywołaniu fprintf. W rzeczywistości w wielu przypadkach nic nie zostanie zapisane, dopóki nie zadzwonisz pod numer fclose.

Dobrą praktyką jest sprawdzanie powrotu fopen, zamykanie plików po zakończeniu itp. Pozwól systemowi operacyjnemu i kompilatorowi wykonać swoją pracę, aby reszta była wydajna, w przypadku prostych programów takich jak ta.

0

Jeśli żaden inny program nie sprawdza obecności ~/program/csv/output.csv w celu dalszego przetwarzania, to to, co robisz, jest w porządku.

W przeciwnym razie można rozważyć zapisanie do numeru FILE * uzyskanego przez połączenie z numerem tmpfile in stdio.h lub podobnym wywołaniem biblioteki, a po zakończeniu skopiowanie pliku do ostatecznego miejsca docelowego. Możesz także odłożyć plik blokady output.csv.lck i usunąć go, gdy skończysz, ale to zależy od tego, czy możesz zmodyfikować zachowanie innego programu.

0

Można tworzyć własne cat, cp, mv programy dla praktyki.

Powiązane problemy