数据输入文件

mcu8008 2008-04-07 05:10:40
void CDSplitDoc::save_2_file(CString FileName) //函数用来写入文件
{
FILE *fp = fopen(FileName, "a");
if (fp == NULL) {
AfxMessageBox("打开文件"+fname+"错误");
return;
}
char buf[1024];
sprintf(buf, "---------\n");
fwrite(buf, strlen(buf), 1, fp);
for (std::map<std::string, std::vector<double> >::iterator i=_map.begin(); i!=_map.end(); ++i) {
sprintf(buf, "%s: ", i->first.c_str());
for (size_t j=0; j<i->second.size(); ++j) {
char temp[32];
sprintf(temp, "%f, ", i->second[j]);
strcat(buf, temp);
}
strcat(buf, "\n");
fwrite(buf, strlen(buf), 1, fp);
}
fclose(fp);
}

void CDSplitDoc::save_data()
{
if (filename == "") {
CFileDialog dlg(TRUE,_T("txt"),_T("*.txt"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("文本文件(*.txt)|*.txt|"));
if(IDOK !=dlg.DoModal ())
return;
}
CString filename = dlg.GetPathName();
save_2_file(filename);
}

在另外一个类中调用这个函数
save_data();

错误提示我error C2228: left of '.GetPathName' must have class/struct/union type
...全文
84 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mcu8008 2008-04-09
  • 打赏
  • 举报
回复
问题已解决
谢谢楼上的各位
vcPlayer 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sangermax 的回复:]
C/C++ code

void CDSplitDoc::save_data()
{
if (filename == "")
{
CFileDialog dlg(TRUE,_T("txt"),_T("*.txt"),OFN_HIDEREADONLY ¦OFN_OVERWRITEPROMPT,_T("文本文件(*.txt) ¦*.txt ¦"));
if(IDOK !=dlg.DoModal ())
return;
filename = dlg.GetPathName();
}
save_2_file(filename);
}
[/Quote]

这样就对了.
mcu8008 2008-04-08
  • 打赏
  • 举报
回复
回复楼上,改成static后麻烦更大,
哪位朋友能实现“保存文件路径,然后每次打开文件进行写入”这个功能???????
保存已打开的路径,以后往里写就行了

应该怎么写??
shakaqrj 2008-04-08
  • 打赏
  • 举报
回复
先简单一点
将filename设为static,如果有错再看
mr.zhoux 2008-04-08
  • 打赏
  • 举报
回复


void CDSplitDoc::save_data()
{
if (filename == "")
{
CFileDialog dlg(TRUE,_T("txt"),_T("*.txt"),OFN_HIDEREADONLY ¦OFN_OVERWRITEPROMPT,_T("文本文件(*.txt) ¦*.txt ¦"));
if(IDOK !=dlg.DoModal ())
return;
filename = dlg.GetPathName();
}
save_2_file(filename);
}


菜牛 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mcu8008 的回复:]
三楼

你的那个方法是没错,但是我要实现的功能是,第一次打开文件,并起名字。以后就不用再打开这个文件了,(它应该自动打开),并且继续往文件中写数据。

你的那个每次都会弹出个框询问要打开的文件(或是新建文件)。
[/Quote]
那你应该保存文件路径,然后每次打开文件进行写入。
scq2099yt 2008-04-08
  • 打赏
  • 举报
回复
ding
mcu8008 2008-04-07
  • 打赏
  • 举报
回复
三楼

你的那个方法是没错,但是我要实现的功能是,第一次打开文件,并起名字。以后就不用再打开这个文件了,(它应该自动打开),并且继续往文件中写数据。

你的那个每次都会弹出个框询问要打开的文件(或是新建文件)。
mcu8008 2008-04-07
  • 打赏
  • 举报
回复
save_data() //函数的作用是如果文件已经存在,那么就继续向该文件中写数据。如果没有文件的话,要创建一个文件,其实文件创建就在刚开始的时候创建,到后面就接着文件里的内容写就行了。


1 楼的朋友,我按照你的说法做了
但是它又提示我出现了别的错误
error C2512: 'CFileDialog' : no appropriate default constructor available

请问这个错怎么解决???
mr.zhoux 2008-04-07
  • 打赏
  • 举报
回复

void CDSplitDoc::save_data()
{
if (filename == "")
return;
CFileDialog dlg(TRUE,_T("txt"),_T("*.txt"),OFN_HIDEREADONLY ¦OFN_OVERWRITEPROMPT,_T("文本文件(*.txt) ¦*.txt ¦"));
if(IDOK !=dlg.DoModal ())
return;

CString filename = dlg.GetPathName();
save_2_file(filename);
}
ahuisafe 2008-04-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fanskydream 的回复:]

这是一个局部变量的问题.

//这是它的有效区域
if (filename == "")
{
CFileDialog dlg(TRUE,_T("txt"),_T("*.txt"),OFN_HIDEREADONLY ¦OFN_OVERWRITEPROMPT,_T("文本文件(*.txt) ¦*.txt ¦"));
if(IDOK !=dlg.DoModal ())
return;
}
CString filename = dlg.GetPathName(); //dlg 这时已失去了生命周期了.

save_2_file(filename);
}

CFileDialog dlg 把这个提到上面,
或都把你…
[/Quote]
TeddyGe 2008-04-07
  • 打赏
  • 举报
回复

这是一个局部变量的问题.

//这是它的有效区域
if (filename == "")
{
CFileDialog dlg(TRUE,_T("txt"),_T("*.txt"),OFN_HIDEREADONLY ¦OFN_OVERWRITEPROMPT,_T("文本文件(*.txt) ¦*.txt ¦"));
if(IDOK !=dlg.DoModal ())
return;
}

CString filename = dlg.GetPathName(); //dlg 这时已失去了生命周期了.

save_2_file(filename);
}

CFileDialog dlg 把这个提到上面,
或都把你的CString filename = dlg.GetPathName(); 放在dlg 可见区域内

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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