[英]fread does not see eof c++
我用他的以下函數編寫了一個二進制文件:
int writeFile(FILE *f_to, void *from, int size){
int write = fwrite(from, 1, size, f_to);
if (write == size)
return 0;
else
return -1; //fails
}
void createDataFile(const char *fname)
{
FILE * out_file;
out_file = fopen(fname, "ab+");
if (out_file == NULL){
std::cout << "error no file to be written" << endl;
}
writeFile(out_file, (INT32U*)&(newPtr->hdr), sizeof(S_MES_HDR));
writeFile(out_file, (INT32U*)&(newPtr->mon_hdr), sizeof(S_MON_HEADER));
writeFile(out_file, (INT32U*)&(newPtr->data_hdr), sizeof(S_MON_DATA_HEADER));
writeFile(out_file, (INT32U*)&(newPtr->data), ((ptr->hdr.id.data_len*sizeof(INT32U)) - sizeof(S_MON_HEADER)-sizeof(S_MON_DATA_HEADER)));
cout<< sizeof(S_MES_HDR)<<endl;
cout<< sizeof(S_MON_HEADER)<<endl;
cout<< sizeof(S_MON_DATA_HEADER)<<endl;
cout<<((ptr->hdr.id.data_len*sizeof(INT32U)) - sizeof(S_MON_HEADER)-sizeof(S_MON_DATA_HEADER))<<endl;
fclose(out_file);
S_TERM_PACKET *monPacketPointer2;
monPacketPointer2 = new S_TERM_PACKET;
out_file = fopen(fname, "ab+");
createMessage(monPacketPointer2, 1, 'R', 6, out_file);
fclose(out_file);
S_TERM_PACKET *monPacketPointer3;
monPacketPointer3 = new S_TERM_PACKET;
out_file = fopen(fname, "ab+");
createMessage(monPacketPointer3, 3, 'M', 3, out_file);
fclose(out_file);
cout << "output file has been created." << endl;
}
int main()
{
createDataFile("test.data");
return 0;
}
我得到以下輸出: http : //prntscr.com/43dpsm 。 我已寫入test.data文件的字節總數為*(16 + 8 + 4 + 40) 3 = 204字節。
現在,當我使用以下功能讀取test.data文件時:
int ReadFile(FILE *f_in, void *dest, int size)
{
int read = fread(dest, 1, size, f_in);
if (read == size){
return 0;
}
return -1;
}
void readData(const char* id, Structure*head)
{
ReadFile(p_file, (INT32U*)&termPacketPointer->hdr, sizeof(S_MES_HDR));
cout << "total read size:" << sizeof(S_MES_HDR)+(termPacketPointer-> hdr.id.data_len)*sizeof(INT32U) << endl;
cout << "data len:" << (termPacketPointer->hdr.id.data_len) << endl;
ReadFile(p_file, (INT32U*)&termPacketPointer->term_data, (termPacketPointer-> hdr.id.data_len)*sizeof(INT32U));
}
int main()
{
// createDataFile("test.data");
File * p_file=fopen("test.data", "rb");
if(p_file==NULL)
return -1;
if (!feof(p_file))
{
readData("25", head);
}
if (!feof(p_file))
{
readData("25", head);
}
if (!feof(p_file))
{
readData("25", head);
}
if (!feof(p_file))
{
readData("25", head);
}
fclose(p_file);
return 0;
}
最后我得到以下輸出和運行時錯誤。
總讀取大小:68個數據len:13
總讀取大小:68個數據len:13
總讀取大小:68個數據len:13
總讀取大小:210756數據len:52685
因此,在讀取68 * 3 = 204字節(等於我已寫入文件的字節數)之后,它沒有停止並繼續讀取。 我的假設是,它沒有看到eof,但我知道fclose會自動將其放置。 我該如何解決我的問題? 提前致謝。
很有幫助的一件事是實際檢查fread()
的返回狀態。 內部函數會執行此操作,並為錯誤返回-1,但是對main()
的調用不會檢查狀態。
在許多實現中, feof()
直到嘗試讀取文件末尾后才變為true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.