c++ - 如何打印到文件?
问题描述
我需要在文件“.txt”上打印一些信息。
我在程序上写了我要复制信息的文件的链接。“.txt”文件为空。
Eclipse 告诉我代码没有错误。这是文件打印代码的一部分:
void stampaVendute(string& vendute,int& n,Opere f[],char p[],int a){
cout<<"\nInserisci il file sul quale vuoi visualizzare le opere vendute: "<<endl;
getline(cin,vendute);
ofstream ofs;
ofs.open(vendute.c_str());
if(!ofs.good()){
cout<<"C'è qualche problema nell'apertura del file"<<endl;
return;
}
for(int i=0;i<n;i++){
if((!stricmp(p,f[i].N_C)) and a<=f[i].anno){
ofs<<"\nOPERA "<<(i+1)<<endl;
ofs<<"Codice: "<<f[i].codice<<";"<<endl;
ofs<<"Titolo: "<<f[i].titolo<<";"<<endl;
ofs<<"Autore: "<<f[i].N_C<<";"<<endl;
ofs<<"Anno: "<<f[i].anno<<";"<<endl;
ofs<<"Valore: "<<f[i].prezzo<<";"<<endl;
}
ofs.close();
}
cout<<"\nI DATI SONO STATI COPIATI CORRETTAMENTE SUL FILE!"<<endl;
}
解决方案
如果if((!stricmp(p,f[i].N_C)) and a<=f[i].anno){
测试失败,则不会将任何内容打印到文件中。添加一行在打开后无条件打印到文件中,看看它是否有效。
文件打开成功后,将文件名打印给用户。
如果您使用的是 Windows,您可以使用SysInternals(现在由 Microsoft 拥有)的进程监视器来查看实际打开的文件。
ofs.open(vendute.c_str());
你为什么在这里使用c_str
?你知道这open
需要一个std::string
正常的!您获得指向原始字符的指针只是为了构造一个新的不同字符串对象,并强制编译器重新计算字符数(strlen()
再次调用)。
无论如何,你应该把它写成一行。定义变量时初始化它:
ofstream ofs {vendute};
⧺SL.io.50不要使用endl
.
for(int i=0;i<n;i++){
... many uses of `f[i]` follows
您应该使用基于范围的for
循环而不是下标,但是您传递数据的方式(指向第一个元素和长度的单独指针)而不是简单地传递集合会阻止这种情况。这不是做事的好方法!见标准指南⧺I.13等。
如果您确实需要通过下标检查集合,请不要一遍又一遍地对其进行下标。创建一个指向该点的引用变量:
for(int i=0;i<n;i++){
const auto& x = f[i];
... now use x over and over, not f[i]
这是你的问题
看看在哪里ofs.close();
被调用。帖子中代码的缩进都搞砸了……看起来这应该在循环之后,最后cout
一行之前。但那额外的}
钱是从哪里来的?
您正在通过循环的第一次迭代后关闭文件。如果这种情况 ( i==0
) 没有打印结果,则不会显示任何内容。
推荐阅读
- excel - excel VBA,在将多个CSV文件复制到一个工作簿时,在单元格中创建一个带有工作表或文件名的列
- python - 如果等于字符串,Python替换数据框值
- amazon-web-services - next.config.js 重写不在 S3 上工作,但在本地工作
- c# - FluentFtp Azure ftp 用户在几次成功连接后无法登录
- javascript - 如果另一个不可用,则加载一些脚本
- seaborn - displot 的图例和归一化
- python - 在 tkinter 循环内刷新数据
- python - 使用潜在狄利克雷分配时,“numpy.int64”对象不可迭代
- python - 我如何在 discord.py 中使用 discord.Member
- javascript - ipcMain.handle 中的 fs.readdir 不返回