[英]Why doesn't the program print to file?
我正在做作業,文本要求我在文件“.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()
再次調用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
) 沒有打印結果,則不會顯示任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.