C++:从 txt 文件读取和写入的成员函数

Posted

技术标签:

【中文标题】C++:从 txt 文件读取和写入的成员函数【英文标题】:C++: Member functions that read and write from txt file 【发布时间】:2017-03-14 18:16:54 【问题描述】:

对于这个问题被问得多么糟糕,我提前道歉,我在这里真的很挣扎。 我正在用 C++ 编写一个名为 Point 的类,其中包含私有成员 x 和 y,以及成员函数 getX、getY、setX、setY、读写。除了读写之外,我什么都能做,因为我对输入/输出文件感到很糟糕。我有以下读写声明:

void read(istream& ins);
void write(ostream& outs);

RME如下供阅读:

* Requires: ins is in good state.
* Modifies: ins, x, y.
* Effects:  Reads point in form (x,y)

对于写:

* Requires: outs is in good state.
* Modifies: outs.
* Effects:  Writes point in form (x,y).

'read' 从给定文件“data1.txt”中获取有序点,如 (1, 5)、(2, 7) 等,并提取 x 和 y 分量(至少,我相信这是应该做)。为我提供了一个测试套件供阅读:

void test_point() 
Point pt1;

pt1.setX(15);

cout << "pt1 is: " << pt1 << endl;

ifstream input_file;
input_file.open("data1.txt");
pt1.read(input_file);
cout << "pt1 is: " << pt1 << endl;

return;

我真的不知道如何编写读取函数。我尝试定义字符 a、b、c 和整数 u、v 并执行:

ins >> a >> u >> b >> v >> c;

但这没有用。有人可以帮我看看如何实现吗?

【问题讨论】:

ins &gt;&gt; x &gt;&gt; y; @MaximEgorushkin 是否可以在文本文件中的有序对写为 (x, y) 的情况下进行这项工作?括号和逗号会发生什么变化? 另外,我如何阅读更多的订购点?写入后我会查看读取功能吗? 您可以发布您的输入文件的样本吗? 【参考方案1】:

您的问题中缺少很多东西,您需要这样才能使用此类。一方面,读取有序点文件不应该作为成员函数来实现。如果有的话,您可以使用这样的循环:

    while(input_file) 
        // set a point to have members x, y that were read from file
        // store this point in a vector of points
    

否则没有合理的方法来存储您从文件中读取的一堆点。

您在 read 函数中对这个解决方案的想法肯定会奏效(假设字符 a、b、c 和 ints u、v):

    input_stream >> a >> u >> b >> v >> c;

事实上,使用您给我们的格式(以 ifstream 作为参数),在 read 函数中确实不需要太多其他内容,因为它会改变对象并且不需要返回任何内容.您的实现是在结构化文件中解析此类“记录”的最简单方法。

阅读完所有这些后,将调用者对象的 x 坐标设置为 u,将 y 坐标设置为 v。这应该是一个 void 函数,不需要返回任何内容,但应该改变它被调用的 Point 对象为了。这个成员函数应该在我提到的循环中的一个临时点对象上调用,然后将该对象添加到点向量中:

    vector<Point> points;
    while(...) 
        // declare Point
        // initialize with values from read
        points.push_back(//the point you just created);
    

如果事实上您需要能够读取多个点。

总而言之,您的读取功能需要:

    首先要检查 ifstream 是否真的很好,我还没有提到(但这是您的要求之一):

    if (!input_file)  //however you want to handle this error 
    

    要读入的临时 char 和 int 变量(用作缓冲区)(顺便说一句,您甚至可以直接读入 x 和 y,而不是读入 u 和 v 然后复制,只是说)。

    如果您选择不直接读取 x 和 y,则必须将 u 和 v 值分配给 x 和 y。现在你的对象已经完成了。

对于 write 函数,您将使用作为参数传递给 write 函数的 ofstream 的名称而不是 std::cout,并使用您显示的格式写入记录。这(本质上)与打印到控制台没有什么不同,除了输出在文本文件上。

注意:确保您了解 iostream 对象(istream、ostream)和 fstream(ifstream、ofstream、fstream)对象之间的区别,在这种情况下更可取。

【讨论】:

以上是关于C++:从 txt 文件读取和写入的成员函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 静态成员函数

C++ 静态成员函数

C++ 静态成员函数

c++文件怎么从文件中读出和写入字符串?

C++函数指针与成员函数指针

怎么样在MATLAB中读取结构体中的数据