2012-06-13 9 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을 반환하며 헤더는 여러 번 인쇄됩니다.

은 내가 r 함께 fopena+fseek/ftell/fclose 다음 fopen을 다시 사용할 수 있습니다 알고 있지만, 나는 그것이 열고 파일을 여러 번 닫지 않고이 작업을 수행하는 것이 가능하다 생각합니다.

+0

파일 입출력 작업은 운영 체제마다 다르므로 작업하는 OS는 무엇입니까? –

+1

'CSV 출력 파일을 열 수 없습니다 ... '는 * bad * 오류 메시지의 표준적인 예입니다. 실제 파일 이름과 오류의 이유를 포함하십시오 ('man perror'와'man strerror'). –

+0

@EitanT : Windows 용 –

답변

6

, fopen 추가 모드에서 파일을 보내고을, 파일 포인터는 파일의 시작에 처음이다 . 당신이 무언가를 쓰거나 곧 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로 선언
내가 윈도우 프로그래밍을 알고하지는 sys/stat.h
다음,하지만 당신을 도울 수 : 사실 http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx

2

a+ 모드 fopen으로 파일을 여는 모든 쓰기 작업은 파일의 끝에서 수행됩니다. 내부 포인터를 파일의 아무 곳이나 위치를 변경하여 읽을 수 있지만 쓰기 작업을 수행하면 파일의 끝으로 다시 이동합니다. 읽기를위한 초기 포인터 위치는 파일의 시작 부분에 있습니다.

따라서 FILE 포인터에서 fseek(pFile, 0, SEEK_END)으로 전화해야합니다.

+0

네, 맞아요! 나는 이것을 단지 10 분 전에 생각했다. 고마워. –

+0

페이지를 새로 고치지 않았습니다 ... 죄송합니다 :) –

관련 문제