2017-02-12 5 views
0

그래서 텍스트 파일을 이진 파일로 변환해야합니다.텍스트 파일을 C의 이진 파일로 변환

텍스트 파일의 예는 될 수

이름 성 아이디 GPA (문자열 문자열 부호 INT 플로트) 된 직후 포맷의 텍스트 파일 :

존 스미스 (32) 2.5

조이 12 3.4

void textToBinary(char *inp, char *out) 
{ 

FILE *finp; 
FILE *fout; 
unsigned int x; 
float y; 
char first[SIZE], last[SIZE]; 

finp = fopen(inp, "r"); 
fout = fopen(out, "w"); 

rewind(finp); 

    while(1) 
    { 
    fscanf(finp, "%s %s %u %f\n", first, last, &x, &y); 

    fwrite(first, 1, sizeof(char), fout); 
    fwrite(last, 1, sizeof(char), fout); 
    fwrite(&x, 4, sizeof(unsigned int), fout); 
    fwrite(&y, 4, sizeof(int), fout); 

     if(feof(finp)) 
     { 
     break; 
     } 

    } 

fclose(finp); 
fclose(fout); 
} 

itsunix에서 diff 명령을 사용하여 출력 된 이진 파일을 이진 파일의 형식과 비교합니다.

>diff output.bin b1.bin 
>Binary Files output.bin b1.bin differ 

따라서 내 텍스트 파일이 적절한 이진 파일로 제대로 변환되지 않아야합니다.

+0

힌트 : 'size_t fwrite (const void * buffer, size_t size, size_t count, FILE * stream)'매개 변수를 확인하십시오. 특히 사이즈와 카운트를 별도로 제공 할 수 있습니다. –

+0

'first'와'last' 둘 다 왜 1 개의 char ('fwrite (first, 1, sizeof (char), fout);) 만 기록 되었습니까? –

+0

정확히 무엇이 문제입니까? 다시 읽으십시오 [ "나는 좋은 질문을합니까?]"(http://stackoverflow.com/help/how-to-ask). –

답변

0

제공된 소스 코드는 fwrite() 함수를 사용하여 이진 파일에 데이터를 기록하는 데 대한 오해를 보여줍니다.

오류 1 - 문자열을 기록하려면 고정 크기 또는 실제 길이를 사용하십시오.

두 줄 모두에 기초하여 fwrite(first, 1, sizeof(char), fout);fwrite(last, 1, sizeof(char), fout);.

사용 :

fwrite(first, (strlen(first)+1), sizeof(char), fout); 

또는 :

fwrite(first, SIZE, sizeof(char), fout); 

오류 2은 - 하나의 unsigned int, 1 개 요소를 사용하여 기록합니다.

라인 fwrite(&x, 4, sizeof(unsigned int), fout); 기준.

사용 :

fwrite(&x, 1, sizeof(unsigned int), fout); 

오류 3은 - 하나 float 기록 올바른 sizeof()를 사용합니다.

라인 fwrite(&y, 4, sizeof(int), fout); 기준.

가 사용 :

fwrite(&y, 1, sizeof(float), fout); 

추가 : fwrite() 반환 된 값을 확인하는 것을 잊지 마세요 사용하는 경우 모든 경우에

이 (작성 요소의 수와 동일해야합니다).

+0

고맙습니다. char의 strlen을 알아 냈습니다 만 float/unsigned int의 바이트 수를 변경하면 도움이됩니다. –

관련 문제