2017-02-12 115 views
0

我正在寫一個函數,它必須遍歷二進制文件並將其寫入文本文件。二進制文件的每一行包含
L1姓名L2姓ID GPA
前)瑪麗Joeseph 1234 4.0如何用fread讀取二進制文件()

其中L1和L2是第一個和最後一個名字的長度,分別爲,ID是一個unsigned int和GPA是一個浮點數(每個4個字節)。
如何正確實現循環遍歷二進制文件,直到它到達EOF?目前,由此產生的文本文件大部分是胡言亂語,我該如何解決它?任何幫助表示讚賞。

int binaryToText() //add parameters 
{ 

unsigned char firstName[255]; 
unsigned char lastName[255]; 
unsigned int id; 
float gpa; 
char nLine[]= "\n"; 
char space[]= " "; 


FILE * binfile = fopen("b2.bin", "r"); //Open and read binary file binfile 
FILE * textfile = fopen("b2totxt.txt", "w");//Open and write to text file 



if(NULL == binfile) //alerts and exits if binfile is not found 
{ 
    fprintf(stderr, "Failed to open file\n"); 
    fflush(stderr); 
    exit(1); 
} 


fread(&firstName, sizeof(firstName), 1, binfile); 
fread(&lastName, sizeof(lastName), 1, binfile); 
fread(&id, sizeof(id), 1, binfile); 
fread(&gpa, sizeof(gpa), 1, binfile); 

printf("%s %s %u %f", firstName, lastName, id, gpa); //test(doesnt come out right) 

fprintf(textfile, "%s %s %u %1.1f\n", firstName, lastName, id, gpa);//also flawed 





fclose(textfile); 
fclose(binfile); //close bin file 
return 0; 

}

+0

在提出這些問題之前,請至少進行一次谷歌搜索。 –

+1

你可以發佈一個實際的行嗎?如果它是一個二進制文件,推測l1,l2,ID和GPA恰好是4個字節,不像ASCII「3」的3個字節。每行結尾處的CR或LF或CRLF之間是否有空白? –

+0

如果您使用的是用'fwrite(firstName,strlen(firstName),1,binfile)編寫的文件; fwrite(lastname,strlen(lastName),1,binfile);'你以前的文章,這段代碼將無法知道一個名字結束,另一個開始。需要重新計劃該文件的輸出。本週結束時,我預測@OP會發布@OP的帖子。 – chux

回答

3

你想讀的二進制數據,但是,你打開文件進行閱讀文本"r"),而不是讀取二進制"rb")。因此,fread()可能將"\r\n"轉換爲"\n",當特定unsigned intfloat值的底層表示包含"\r\n"序列時,這可能會導致問題。

更改此:

FILE * binfile = fopen("b2.bin", "r"); 

要這樣:

FILE * binfile = fopen("b2.bin", "rb"); 

"rb",該b代表二進制模式。


不過,我不認爲這是你的主要的問題,因爲你二進制文件實際上並不包含二進制表示的數據的;它包含人類可讀的表示(基於您給出的示例)。您應該使用fscanf,而不是fread來讀取該數據。

更改此:

fread(&firstName, sizeof(firstName), 1, binfile); 
fread(&lastName, sizeof(lastName), 1, binfile); 
fread(&id, sizeof(id), 1, binfile); 
fread(&gpa, sizeof(gpa), 1, binfile); 

要這樣:

int n = fscanf(binfile, "%s %s %u %f", firstName, lastName, &id, &gpa); 
+0

你對「rb」是正確的,我錯過了我自己。然而,數據是二進制數據,我給出的例子在技術上應該轉化爲文本文件,因此我認爲fread()仍然是我應該使用的函數。任何幫助循環?我迷失了那部分。謝謝 –

+0

你有什麼嘗試?你應該問一個關於這個問題,注意任何不當行爲或錯誤信息,並詢問你對什麼感到困惑...... – Sebivor

0

FILE * binfile = fopen("b2.bin", "r");

這應該是

FILE * binfile = fopen("b2.bin", "rb"); 要打開任何二進制文件。