【问题标题】:How to print to file?如何打印到文件?
【发布时间】:2021-10-12 15:06:51
【问题描述】:

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

【问题讨论】:

  • 您输入的是完整路径还是相对路径?另外,ofstreamopen 可以接收std::string,所以不知道你为什么在那里使用.c_str()
  • 不,这不足以知道出了什么问题。例如,n 是什么?当它是0 时,不会有任何写入文件的内容。请阅读minimal reproducible example
  • 您是否尝试过调试程序?
  • 尼特,没有理由在这里引用n

标签: c++ arrays filestream


【解决方案1】:

如果if((!stricmp(p,f[i].N_C)) and a&lt;=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) 没有打印结果,则不会显示任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2023-02-24
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多