我是C++編碼的新手。我的應用程序需要將變量寫入文件,然後我想再次閱讀它們以完成一些工作。從文件中讀取錯誤的值
我將值賦給變量,然後轉儲到文件上,但是當我讀取文件並檢查變量時,它將賦予不同的值。 下面是我正在使用的3個結構。
struct fence_t
{
uint8_t b:1;
uint8_t fence_1:2;
uint8_t fence_2:2;
uint8_t res:3;
};
struct head_t
{
uint8_t format;
fence_t fence;
};
struct pack_t
{
head_t header;
.
.
.
}
我已經指定格式= 2
packet[i].header.format=2;
packet[i].header.fence.b=0;
packet[i].header.fence.fence_1=2;
packet[i].header.fence.fence_2=2;
packet[i].header.fence.res=0;
我這是怎麼打開的文件,並傾倒在它的數據。我想要以十六進制格式寫入值。
f = fopen("packets.txt","w");
fprintf(f, "%04X", packet[i].header);
現在在另一個函數中我想讀取文件。
ff.seekg(0,ios::end);
size=ff.tellg();
memblock = new pack_t [size/sizeof(pack_t)];
ff.seekg(0,ios::beg);
ff.read((char *)memblock,size);
void * p = (void *)memblock;
for(int i=0;i<3;i++)
{
struct q_entry_t t = {i, p};
queue1.push_back(t);
p = (void *)((uintptr_t)p+64);
}
當我檢查格式的值它顯示1.
cout<<((head_t *)p)->format<<endl;
這是存儲窗口的Visual Studio中的輸出時,我看在p
0x026A54B8 31中的值34 30 32 30 30 30 31 30 31 30 30 30 30 30 31 30 30 140200010100000100
好像你正在寫作ASCII並試圖讀回二進制。您想做什麼? – pm100
爲了清楚起見,當你這樣做時,你的工具鏈不會*發出警告:'fprintf(f,「%04X」,packet [i] .header);'?即發送一個'head_t'到一個'printf'-family說明符,它需要一個無符號整數?有趣。轉到C/C++項目屬性並打開警告級別。應該已經檢測到了。 – WhozCraig
使用'fwrite'會好很多,它不會指望任何格式化的輸入。如果你熟悉C++做這些事情的方法(儘管它有點難),而不是舊的C方式,那麼你會更好。 – Wug