首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

自定义文件解决办法

2012-03-09 
自定义文件小妹对自定义文件格式有些模糊。。。eg,有一些参数要写入文件,怎样定义文件格式,读的时候,能知道从

自定义文件
小妹对自定义文件格式有些模糊。。。

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()
[解决办法]
其实直接把一个结构体按二进制写入文件最方便了,不过就是不能直接用文本打开看

下面是刚刚想到的一个简单的参数写入与读出,需要完善地方还很多~~

C/C++ code
#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;} 

热点排行