如何打印到文件?
How to print to file?
我需要在文件“.txt”上打印一些信息。
我在程序上写了 link 我想复制信息的文件。 “.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();
被调用的位置。 post 中代码的缩进全乱了......看起来应该在循环之后,最后的 cout
行之前。但是额外的 }
是从哪里来的?
您将在循环的第一次迭代后关闭文件。如果这种情况 (i==0
) 没有打印结果,则不会显示任何内容。
我需要在文件“.txt”上打印一些信息。
我在程序上写了 link 我想复制信息的文件。 “.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();
被调用的位置。 post 中代码的缩进全乱了......看起来应该在循环之后,最后的 cout
行之前。但是额外的 }
是从哪里来的?
您将在循环的第一次迭代后关闭文件。如果这种情况 (i==0
) 没有打印结果,则不会显示任何内容。