2012-04-13 5 views
0

일부 파일의 내용을 버퍼에 넣은 다음 다른 파일에 버퍼의 내용을 쓰려고합니다. 데이터가 기록되는 파일에는 기록 된 데이터의 일부만 들어 있습니다. 크기는 약 1KB입니다. 나머지 데이터를 쓰는 방법?에서 읽은 파일과 작성한 파일이 같지 않음

fp1 = fopen("a.txt","rb"); 
fp2 = fopen("b.txt","wb"); 

fread(buffer, 1, BUFFER_SIZE,fp1);//reading from file pointed to by fp1 
//BUFFER_SIZE = 3KB 
fwrite(buffer, 1, BUFFER_SIZE, fp2);//writing into a file pointed to by fp2 

fwrite를 수행 한 후 fflush가 수행합니까?

답변

0

아니요fread에서 요청한 모든 바이트를 제공한다는 것을 보장합니다. 그것은 리턴 코드가 무엇인지에 대한 정보를 줄 수 있습니다.

fwrite에 보낼 정보의 양을 알아 내기 위해 리턴 코드를 사용해야합니다.

리턴 코드 확인은 fopen 호출까지 확장됩니다. 오픈이 작동한다는 보장은 없습니다. 예로서

다음 전체 프로그램은 한 파일에서 다른 파일로 3K까지 복사하려고 시도합니다 :

#include <stdio.h> 
#include <errno.h> 

int main (void) { 
    FILE *fp1, *fp2; 
    char buff[3*1024]; 
    int bytesRead; 

    // Open both files. 

    if ((fp1 = fopen ("a.txt", "r")) == NULL) { 
     printf ("Error %d opening a.txt\n", errno); 
     return 1; 
    } 
    if ((fp2 = fopen ("b.txt", "w")) == NULL) { 
     printf ("Error %d opening b.txt\n", errno); 
     fclose (fp1); 
     return 1; 
    } 

    // Transfer only up to buffer size. 

    if ((bytesRead = fread (buff, 1, sizeof (buff), fp1)) == 0) { 
     // Check error case. 

     if (ferror (fp1)) { 
      printf ("Error reading a.txt\n"); 
      fclose (fp1); 
      fclose (fp2); 
      return 1; 
     } 
    } 

    // Attempt transfer to destination file. 

    if (fwrite (buff, 1, bytesRead, fp2) != bytesRead) { 
     printf ("Error writing b.txt\n"); 
     fclose (fp1); 
     fclose (fp2); 
     return 1; 
    } 

    // Close all files to finish up. 

    fclose (fp1); 
    fclose (fp2); 
    return 0; 
} 
+1

'fread()'* 단지 *는 에러가 발생하거나 파일의 끝에 도달하면 짧은 항목 수를 반환합니다. 'fread()'를 다시 시도 할 필요가 없습니다 - 파일 끝에 도달하면 더 이상 데이터가 없습니다. 오류가 발생하면 파일 위치 표시기의 값이 불확실합니다. 이는'read()'와 같은 기본적인 저수준 함수와는 달리, 오류없이 짧은 읽음을 반환 할 수 있습니다. – caf

3

fflush(fp2) 또는 fclose(fp2)은 보류중인 버퍼링 된 바이트를 디스크로 옮깁니다.

+0

당신이에 fwrite가 FFLUSH 또는 FCLOSE없이 항상 신뢰할 수없는 말을 의미합니까? –

+0

'fwrite()'는 신뢰할 만하지만, 대다수의 프로그램 사용에 대한 전반적인 효율성을 위해 기본적으로 버퍼링이 포함됩니다. 만약 당신이하고있는 일이 버퍼링을 필요로하지 않는다면, 그 파일을 열고 나서'setbuf()'를 사용하여 버퍼링을 비활성화 할 수 있습니다. – wallyk

+2

@ajaybidari : 프로세스가 정상적으로 종료되면 ('main()'또는 'exit()'를 호출하여) 버퍼링되지 않은 데이터가있는 모든 열린 스트림이 플러시되고 열려있는 모든 스트림이 닫힙니다. 'fflush()'또는'fclose()'를 사용해도, 운영체제에 의해 버퍼링 될 수 있으며, 따라서 OS 충돌에 의한 시스템 클럭 후에도 OS 고유의 동기화 함수를 호출하지 않아도 내구성이 떨어질 수 있습니다. – caf