自定义文件
小妹对自定义文件格式有些模糊。。。
eg,有一些参数要写入文件,怎样定义文件格式,读的时候,能知道从文件的哪里读到哪里是什么参数。写的时候,能知道一个参数该从文件的哪里写到哪里。
大虾们,能用c++代码说明下,如何定义这个文件格式。
非常感谢O(∩_∩)O~
[解决办法]
完全自定义就行,一个参数占一个固定长度,读的时候也按长度偏移读
[解决办法]
typedef struct defineexample_t
{
int a;
char temp [20];
}defineexample;
置于读写你可以直接把结构体当成留写进去..然后当成流读近来 ...强制转换成结构体
fputs(pfile,(char *)defineexample,sizeof());
fgets();
[解决办法]
看一下c的文件操作,fwrite和fread都可以写自定义结构体,这个算是最简单的文件格式了。
[解决办法]
唉……
如果仅仅是记录参数的话……
楼主还是用现成的xml啊,ini之类的成熟的解决方案吧……
[解决办法]
定义一个序列化的类
class CSerialize
{
int Serialize(int aiInt) { write(aiInt);}
int Serialize(char aiChar) {write(aiChar);}
..............
};
一个结构体
struct STRU_DATA
{
int miData1;
int miData2;
....
int Serialize(CSerialize &aoSerialize)
{
int liOffset = 0;
liOffset += aoSerialize(miData1);
liOffset += aoSerialize(miData2);
}
};
void main()
{
CSerialize loSerialize;
STRU_Data loData;
loData.Serialize(loSerilize);
}
序列化就这么干
[解决办法]
如果能用MFC的序列化最好,不行的话,就像楼上自己写一个序列化的类,将类的数据成员逐个写入文件,读的时候也能用来初始化一个对象,顺便看看MFC序列化怎么实现。
[解决办法]
用ini文件读写API方便
WritePrivateProfileString(_T("student"),_T("age"),_T("20"),_T("d:\\info.ini"))
WritePrivateProfileString(_T("student"),_T("name"),_T("abc"),_T("d:\\info.ini"))
然后文件里的内容就变成这样了:
[student]
age=20
name=abc
读的时候用:GetPrivateProfileString
具体可以上网查查,读写很方便,细节完全不需要考虑
[解决办法]
import wx
#---------------------------------------
text="Popmenu"
class MyFrame(wx.Frame):
def __init__(
self, parent, ID, title, pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE
):
wx.Frame.__init__(self, parent, ID, title, pos, size, style)
panel = TestPanel(self, -1)
self.CreateStatusBar()
class TestPanel(wx.Panel):
def __init__(self, parent, log):
wx.Panel.__init__(self, parent, -1)
box = wx.BoxSizer(wx.VERTICAL)
# Make and layout the controls
fs = self.GetFont().GetPointSize()
bf = wx.Font(fs+4, wx.SWISS, wx.NORMAL, wx.BOLD)
nf = wx.Font(fs+2, wx.SWISS, wx.NORMAL, wx.NORMAL)
t = wx.StaticText(self, -1, text)
t.SetFont(nf)
box.Add(t, 0, wx.CENTER|wx.ALL, 5)
t.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)
self.SetSizer(box)
self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)
def OnContextMenu(self, event):
#print ("OnContextMenu\n")
# only do this part the first time so the events are only bound once
#
# Yet another anternate way to do IDs. Some prefer them up top to
# avoid clutter, some prefer them close to the object of interest
# for clarity.
if not hasattr(self, "popupID1"):
self.popupID1 = wx.NewId()
self.popupID2 = wx.NewId()
self.popupID3 = wx.NewId()
self.popupID4 = wx.NewId()
self.popupID5 = wx.NewId()
self.popupID6 = wx.NewId()
self.popupID7 = wx.NewId()
self.popupID8 = wx.NewId()
self.popupID9 = wx.NewId()
self.Bind(wx.EVT_MENU, self.OnPopupNine, id=self.popupID9)
# make a menu
menu = wx.Menu()
# Show how to put an icon in the menu
item = wx.MenuItem(menu, self.popupID1,"One")
menu.AppendItem(item)
# add some other items
menu.Append(self.popupID2, "Two")
menu.Append(self.popupID3, "Three")
menu.Append(self.popupID4, "Four")
menu.Append(self.popupID5, "Five")
menu.Append(self.popupID6, "Six")
# make a submenu
sm = wx.Menu()
sm.Append(self.popupID8, "sub item 1")
sm.Append(self.popupID9, "sub item 1")
menu.AppendMenu(self.popupID7, "Test Submenu", sm)
# Popup the menu. If an item is selected then its handler
# will be called before PopupMenu returns.
self.PopupMenu(menu)
menu.Destroy()
def OnPopupNine(self, event):
print #("Popup nine\n")
if __name__ == '__main__':
app=wx.App()
f=MyFrame(None,-1,'hello')
f.SetIcon(wx.Icon('smile.ico', wx.BITMAP_TYPE_ICO))
f.Show()
app.MainLoop()
[解决办法]
其实直接把一个结构体按二进制写入文件最方便了,不过就是不能直接用文本打开看
下面是刚刚想到的一个简单的参数写入与读出,需要完善地方还很多~~
#define writeParam( x ) fprintf(f, "" #x " = %d\n", x )#define readParam( x ) fscanf(f, "" #x " = %d\n", &x )//这2个define定义的文件的读写的“字符串格式”必须一样int main(){ int a=5,b=9,c=88; FILE *f=fopen("d:\\aa.txt","w+"); writeParam( a ); writeParam( b ); writeParam( c ); fclose(f); a=0;b=0;c=0; //读取,不过读的时候名字要一样的,而且顺序还不能错...你自己再完善下吧,比如随机插入、修改之类的就不好弄了 f=fopen("d:\\aa.txt","r+"); readParam(a); readParam(b); readParam(c); fclose(f); cout<<a<<" "<<b<<" "<<c<<" "<<endl; cin>>a;}