首页 > 解决方案 > 如何打印到文件?

问题描述

我需要在文件“.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;
}

标签: c++arraysfilestream

解决方案


如果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) 没有打印结果,则不会显示任何内容。


推荐阅读