2011-04-14 4 views
0

아래 코드에서는 파일을 올바르게 작성하고 있습니다.fwrite가 왜 계속 실패하는지 계속 하시겠습니까?

if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH) 
{ 
    fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName); 
    return EXIT_FAILURE; 
} 

아무도 내가 여기에 잘못했던 것을 볼 수 있습니까 : 나는

내 프로그램이 항상 if 문을 유발 끝 그러나 진 ÍÌ[email protected]@ÍÌÜ@ffFAßOeA^@^@bBf6zE33äCff<83>BÍ̦B의 스트림을 볼 floats.dat 나는 파일에서 볼 때? 아래의 전체 코드. 파일을 열 때 바이너리 모드를 지정해야합니다 있도록

#include <stdlib.h> 
#include <stdio.h> 
#define LENGTH 10 

int main(void) 
{ 
    FILE *binaryFile, *textFile; 
    char *binaryFileName = "floats.dat", *textFileName = "floats.txt"; 
    float floats[LENGTH] = {3.2, 3.55, 6.9, 12.4, 14.332, 56.5, 4003.4, 456.4, 65.7, 83.4}; 
    float inputFloats[LENGTH]; 
    int i; 

    if((binaryFile = fopen(binaryFileName, "r+")) == NULL) 
    { 
     fprintf(stderr, "Problem opening %s", binaryFileName); 
    } 

    if(fwrite(floats, sizeof(float), LENGTH, binaryFile) < LENGTH) 
    { 
     fprintf(stderr, "Problem writing some or all data to %s\n", binaryFileName); 
     return EXIT_FAILURE; 
    } 

    printf("DATA WRITTEN SUCCESSFULLY\n"); 

    if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH) 
    { 
     fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName); 
     return EXIT_FAILURE; 
    } 

    for(i = 0; i < LENGTH; i++) 
    { 
     printf("float[%d] = %f\n", i, floats[i]); 
    } 

    return EXIT_SUCCESS; 
} 
+1

는 읽기가 별도의 파일 위치인가 같은 파일에 글을 쓰고 싶습니까? fread가 방금 쓴 것보다 더 많은 수레를 읽으 려하지 않으면. 이 경우'rewind (binaryFile)'을 사용하십시오. – LumpN

답변

7
  • 당신은 텍스트 데이터와 함께 작동하지 않는 것입니다. r+ 대신 r+b을 사용하십시오.
  • 쓰기 후에 파일을 "되감 으려면"fseek(binaryFile, 0, SEEK_SET)해야합니다. 이 경우에도 rewind을 사용할 수 있습니다. fseek을 사용하면 원하는 위치에 읽기/쓰기 포인터를 배치 할 수 있습니다.
+0

에릭, 정말 고마워. rewind (binaryFile)와 같이 @steabert가 사용했던 것과 같은 단순한 호출을 사용하는 데 어떤 몰락이 있습니까? – Chris

+0

또한 나는 그냥 놀고 있었고, 이제는 효과가있다. 나는 'r +'를 사용할 때도 여전히 같은 결과를 얻는다. 'r +'로 열었을 때 바이너리 파일을 사용하지 않는 fopen의 다른 구현을 사용하여 다른 시스템으로 이식 된 경우 'r + b'를 코드에 대해 안전하지 않은 것으로 지정하고 있습니까? – Chris

+1

@Chris Paynter :'되감기 '는 여기에서 완벽합니다. 당신은'fseek'에 대해 알아야합니다. 'r + b'는 임베디드'\ n'을 가진 아무 것도 피들링하지 못하도록 보장합니다 - 여러분의 플랫폼에서는 필요하지 않을 수도 있습니다. – Erik

1

FILE 구조체는 파일에서 현재 가리키는 위치를 기록합니다. binaryFile으로 작성 했으므로 파일 포인터는 사용자가 작성한 내용의 에 있습니다.

따라서 읽으려면 fseek(binaryFile, 0, SEEK_SET);을 사용하여 파일을 되감 으셔야합니다.

0

파일에 쓰기가 끝나면 FILE 포인터가 끝에 있으므로 읽기를 시도해도 물론 작동하지 않습니다. 읽으려면 fseek을 사용하여 포인터를 파일의 시작 부분으로 이동하십시오.

이를 피하십시오 :

if((binaryFile = fopen(binaryFileName, "r+")) == NULL) { 

을하고 선호하는이 :

당신은 그것을 읽기 전에 파일을 되감기 깜빡
binaryFile = fopen(binaryFileName, "rb+"); 
if(!binaryFile) { 
+0

여기에있는 것과 같이 명확하게 읽을 수있을 때 조건에 할당 할 때 아무런 문제가 없습니다. – Erik

+0

'='조건부 점프에서는 결코 가치가 없습니다. 죄송합니다보다 더 안전. –

관련 문제