自定义文件

tzcherish 2009-11-21 05:35:03
小妹对自定义文件格式有些模糊。。。

eg,有一些参数要写入文件,怎样定义文件格式,读的时候,能知道从文件的哪里读到哪里是什么参数。写的时候,能知道一个参数该从文件的哪里写到哪里。

大虾们,能用c++代码说明下,如何定义这个文件格式。

非常感谢O(∩_∩)O~
...全文
184 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
tzcherish 2009-12-07
  • 打赏
  • 举报
回复
问题基本解决了。。。thanks,O(∩_∩)O~
tzcherish 2009-12-04
  • 打赏
  • 举报
回复
to varding

我要的效果其实是不能用文本直接打开查看的,我觉得二进制文件可以,文本文件也可以,只是需要加密和解密,其实都行,我这里需要找到一种文件格式,使得读写文件,和修改文件内某个参数等都要方便。。。
我之前也一直考虑二进制文件,二进制不需要加密解密,这是个优势,也想到过用struct。当时想的时候,觉得struct还不是很方便。
你之前说的那种配置文件的格式,读取,修改都还是蛮方便的。我用的是VS2005+Qt,Qt里也提供了相应的类,还是蛮方便的,只是还要加密和解密,并且还不好操作。。。。
anyway,谢谢你的答复~
tzcherish 2009-12-04
  • 打赏
  • 举报
回复
to python127

你用的是哪种编程语言啊?我看不懂,囧。。。能把你的思路方法说明下么?
varding 2009-12-03
  • 打赏
  • 举报
回复
其实直接把一个结构体按二进制写入文件最方便了,不过就是不能直接用文本打开看

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

#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;
}


写到文件里的是这种格式:
a = 5
b = 9
c = 88
python127 2009-12-03
  • 打赏
  • 举报
回复
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()
varding 2009-12-02
  • 打赏
  • 举报
回复
用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

具体可以上网查查,读写很方便,细节完全不需要考虑
tzcherish 2009-12-02
  • 打赏
  • 举报
回复
to varding

O(∩_∩)O谢谢
tzcherish 2009-11-24
  • 打赏
  • 举报
回复
额,没有人再给回答了么。。。。
up
tzcherish 2009-11-23
  • 打赏
  • 举报
回复
to cattycat, beginnow

序列化在这里咋理解啊?
cattycat 2009-11-22
  • 打赏
  • 举报
回复
如果能用MFC的序列化最好,不行的话,就像楼上自己写一个序列化的类,将类的数据成员逐个写入文件,读的时候也能用来初始化一个对象,顺便看看MFC序列化怎么实现。
beginnow 2009-11-22
  • 打赏
  • 举报
回复
定义一个序列化的类
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);
}

序列化就这么干
tzcherish 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mstlq 的回复:]
唉……
如果仅仅是记录参数的话……
楼主还是用现成的xml啊,ini之类的成熟的解决方案吧……
[/Quote]

to mstlq
呵呵,我也很郁闷啊,可是人家就是不让我用xml啊,非得让我自定义啊。。。
mstlq 2009-11-22
  • 打赏
  • 举报
回复
唉……
如果仅仅是记录参数的话……
楼主还是用现成的xml啊,ini之类的成熟的解决方案吧……
tzcherish 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cattycat 的回复:]
看一下c的文件操作,fwrite和fread都可以写自定义结构体,这个算是最简单的文件格式了。
[/Quote]

to cattycat
这种文件格式,不能满足我的要求。。。我的参数的个数很多,其中有些参数不是单个的,是以表格形式出现,可能是几维的数组。有没有更好的方法呢?
tzcherish 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xhd3767 的回复:]
typedef struct defineexample_t
{
  int a;
  char temp [20]; 
}defineexample;
置于读写你可以直接把结构体当成留写进去..然后当成流读近来 ...强制转换成结构体
fputs(pfile,(char *)defineexample,sizeof());
fgets();
[/Quote]

to xhd3767
这种方式可以,用流时,参数的顺序是一定的,什么顺序写入得按相同的顺序读出。当参数有接近100个时,这种方式好么?
cattycat 2009-11-21
  • 打赏
  • 举报
回复
看一下c的文件操作,fwrite和fread都可以写自定义结构体,这个算是最简单的文件格式了。
xhd3767 2009-11-21
  • 打赏
  • 举报
回复
typedef struct defineexample_t
{
int a;
char temp [20];
}defineexample;
置于读写你可以直接把结构体当成留写进去..然后当成流读近来 ...强制转换成结构体
fputs(pfile,(char *)defineexample,sizeof());
fgets();
tzcherish 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
完全自定义就行,一个参数占一个固定长度,读的时候也按长度偏移读
[/Quote]

to jackyjkchen

这个我明白,但是就是不知道该如何用代码实现定义。。。

PS: 我想让每个参数占一行,读写应该会方便点。
jackyjkchen 2009-11-21
  • 打赏
  • 举报
回复
完全自定义就行,一个参数占一个固定长度,读的时候也按长度偏移读

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧