【问题标题】:Writing data to a text file column wise in C++ [duplicate]在 C++ 中以明智的方式将数据写入文本文件列 [重复]
【发布时间】:2013-03-28 11:34:27
【问题描述】:

我是 C++ 的初学者。我已经通过一个对象数组输入了变量的值(属于一个类)。现在我如何将它们写入文本文件列,如下所示?谢谢…………

SLNO    NAME      ADDRESS        PHONE NO     TYPE      
   1.   ABC       xyzagsgshsh    27438927     Mobile
   2.   QWE       qwhjbbdh       78982338     Landline

这是我存储数据的代码。如何将其制作成内容如下的文本文件?

#include<iostream>
#include<string>
#include<fstream>
using namespace std;

class emp
{
    string name,address,phone,type;
    public:
    void getdata();
}obj[5];

void emp::getdata()
{
    cout<<"\nEnter the details:";
    cout<<"\nName: ";cin>>name;
    cout<<"Address:";
    cin>>address;
    cout<<"Phone number: "; cin>>phone;
    cout<<"\nType of phone? (Landline/Mobile) :";
    cin>>type;
}

int main()
{
    ofstream ptr;
    ptr.open("Phone.dat",ios::out);
    cout<<"\nEnter the no.of.records: ";
    int n,i;
    cin>>n;
    for(i=0;i<n;i++)
    {
        obj[i].getdata();
        ptr.write((char*)&obj[i],sizeof(obj[i]));
    }
    return 0;
}

【问题讨论】:

  • 如果您输入了这些值,那么您已经完成了困难的部分,所以我有点困惑为什么您会卡在输出上。您能否展示到目前为止您编写的代码,或者解释您遇到的问题。你的问题有点含糊。
  • 从学习标准库的格式化输出功能开始。您可以在 this website 上找到所有关于它们的信息,或者在 google 上查找“C++ 格式化输出”。
  • @john:代码如上。如前所述,我需要将 Phone.dat 文件制作成文本文件。
  • @Razius 好吧,您不使用用于二进制数据的write,只是ptr &lt;&lt; obj[i].name &lt;&lt; '' obj[i].address &lt;&lt; '\n'; 等是一个开始。使用 ptr 就像使用 cout 一样。由于您已经知道如何使用cout,因此您已经知道如何写入文件。

标签: c++ file file-io


【解决方案1】:

由于您已经创建了文件流,您可以利用输出标志(std::left、std::right 和 std::setw):

http://www.cplusplus.com/reference/iomanip/setw/

http://www.cplusplus.com/reference/ios/left/

现在,为了确保存储在 emp 类的任何对象中的任何字符串不超过您通过 std::setw 分配给 ofstream/ostream 的大小,您可以使用 string::resize。

【讨论】:

    【解决方案2】:

    您可以使用字符串/file 流、换行符和std::setw

    ofstream myfile;
    myfile.open ("example.txt");
    myfile << "SLNO" << std::setw(10) << "NAME" << std::setw(10) << "ADDRESS" << std::setw(10) << "PHONE NO" << std::setw(10) << "TYPE\n";
    

    这会将所有文本与10-text lenght空格隔开,并将其放入example.txt

    记得检查文件的有效性并关闭文件。

    【讨论】:

    • 请注意,默认情况下,ostream 右对齐。 (这通常是数值所需要的。)因此,直接在您输出的字符串上使用resize 通常更容易。
    • 但是我输入的值是否会存储到右侧列下的文本文件中?
    • 如果您输入空格数(只要确保您的列文本的长度永远不会超过 setw(x),其中 x 是您的列可以包含的总字符数+空格数) ),是的。
    • 例如,如果您在列前设置了 setw(10),但您在其中输入的文本长度为 12 个字符,则整行将错位。
    【解决方案3】:

    这取决于上下文。对于控制台的简单输出 窗口(或者如果您在其他地方有固定宽度的字体,但那是 相当罕见),您可以在每个元素之前使用std::setw, 指定字段的宽度。对于文本(std::string), 然而,通常更容易使用resize,并使其成为 正确的尺寸开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-12
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 2018-08-13
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多