2012-06-13 28 views
8

ファイルが空であるかどうかを確認するにはどうすればよいですか?このファイルは、Windowsプラットフォーム上で実行されているCプログラムによって開かれます。私は追加モードでファイルを開きたいのですが、空の場合は最初にヘッダを出力します。 ファイルが空であるかどうかを確認するにはどうすればよいですか?

// Open CSV & write header 
report_csv = fopen("SNR.csv", "a+"); 
if (!report_csv) { 
    fprintf(stderr, "Unable to open CSV output file..."); 
    return -1; 
} 
if (!ftell(report_csv)) { 
    fprintf(report_csv, "Column A;Column B;Column C\n"); 
} 
// ... print data to file 
fclose(report_csv); 

は、私はファイルが空でなかった場合、上記のコードがループしているので、たまたま、現在のファイルサイズを返すように ftellを期待していました。

ただし、ftellは常に0を返し、ヘッダーは複数回印刷されます。

私はrfopen私ができることを知っているとfseek/ftell/fcloseを使用して、fopenそれを再びa+と、私はそれが開放せずにこれを行うことは可能だと思うし、ファイルを複数回を閉じます。

+0

ファイルI/O操作はオペレーティングシステムによって異なりますので、作業しているOSは何ですか? –

+1

'CSV出力ファイルを開くことができませんでした... 'は、* bad *エラーメッセージの標準的な例です。実際のファイル名とエラーの理由( 'man perror'と' man strerror')を含めてください。 –

+0

@EitanT:Windows用 –

答えて

6

fopen追加モードでファイルをINGのを、ファイルポインタはファイルの初めに最初にあります。あなたが何かを書いたり、fseekを書いたりすると、すぐにその最後に移動します。

if (!ftell(report_csv))の前にfseek(report_csv, 0, SEEK_END);を追加するだけで済みました。

これを確認してください。
コード

#include <stdio.h> 

int main(int argc, char **argv) { 
    FILE *test; 
    size_t size; 
    char buf[100]; 

    /* Truncate file */ 
    test = fopen("test", "w"); 
    if (!test) { 
     fprintf(stderr, "Cannot open file `test`!\n"); 
     return 1; 
    } 

    /* Write something */ 
    fprintf(test, "Something. "); 
    fclose(test); 

    /* Open in append */ 
    test = fopen("test", "a+"); 
    if (!test) { 
     fprintf(stderr, "Cannot open `test` in append mode!\n"); 
     return 1; 
    } 

    /* Try to get the file size */ 
    size = ftell(test); 
    printf("File pointer is: %d\n", size); 
    fseek(test, 0, SEEK_END); 
    size = ftell(test); 
    printf("After `fseek(test, 0, SEEK_END)`, the file pointer is: %d\n", size); 

    /* Append */ 
    fprintf(test, "And that. "); 
    fclose(test); 

    /* Same without fseek */ 
    test = fopen("test", "a+"); 
    if (!test) { 
     fprintf(stderr, "Cannot open `test` in append mode!\n"); 
     return 1; 
    } 
    fprintf(test, "Hello! "); 
    size = ftell(test); 
    printf("File size is now: %d\n", size); 
    fclose(test); 

    /* Try to read */ 
    test = fopen("test", "r"); 
    if (!test) { 
     fprintf(stderr, "Unable to open `test` for reading!\n"); 
     return 1; 
    } 
    printf("File contents:\n\t"); 
    while (test && !feof(test)) { 
     fgets(buf, sizeof(buf), test); 
     printf("%s", buf); 
    } 

    /* Cleanup & exit */ 
    fclose(test); 
    printf("\n\nExiting.\n"); 

    return 0; 
} 

出力

File pointer is: 0 
After `fseek(test, 0, SEEK_END)`, the file pointer is: 11 
File size is now: 28 
File contents: 
     Something. And that. Hello! 

Exiting. 
1

_stat()に電話し、st_sizeの値をstruct _statにすることができます(ファイルを開く必要はありません)。 sys/types.hで宣言
は、私はWindowsプログラミングを知っているドントsys/stat.h
が続くが、それはあなたを助けることができる:実際にhttp://msdn.microsoft.com/en-us/library/14h5k7ff.aspx

2

a+モードでfopenでファイルを開くと、すべての書き込み操作は、ファイルの最後に実行されます。内部ポインタをファイル内のどこにでも配置して読み込みを行うことができますが、書き込み操作ではファイルの末尾に戻ります。読み取りのための最初のポインタ位置は、ファイルの先頭にあります。

したがって、FILEポインタでfseek(pFile, 0, SEEK_END)に電話する必要があります。

+0

うん、そうだよ!私はこれをちょうど10分前に考えました。どうもありがとう。 –

+0

ページを更新していません...ごめんなさい:) –

関連する問題