繁体   English   中英

为什么程序不打印到文件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM