写入文件后立即从文件中读取

Reading from file right after Writing in it

我想写入文件然后从中读取并打印结果

这是我的代码

#include<iostream>
#include<fstream>
using namespace std;
int main(int argc,char* argv[]){

int x,y;
ofstream fd1(argv[1]);
ifstream fd2(argv[1]);
cin>>x;
fd1<<x;
fd2>>y;
cout<<"just read "<<y<<endl;
fd1.close();
fd2.close();
return 0;
}

这是怎么回事?我输入 123 它输出 "just read -1078463800"

即使您可以同时以读写方式打开,此写入操作也是 缓冲的,这意味着它可能不会写入磁盘,除非您刷新流(或者您关闭文件)。

当然下面的代码可以完美运行:

#include<iostream>
#include<fstream>
using namespace std;
int main(int argc,char* argv[]){

int x,y;
ofstream fd1(argv[1]);

cin>>x;
fd1<<x;


fd1.close();

ifstream fd2(argv[1]);
if (fd2.good())
{
   cout << "read OK" << endl;
}
fd2>>y;
cout<<"just read "<<y<<endl;
fd2.close();

return 0;
}

fd2>>y 语句失败,因为尚无可从文件中读取的内容。 std::ofstream 缓冲其输出,并且您在尝试从文件读取之前没有将缓冲区刷新到磁盘上的文件。

std::ofstream 在以下情况下刷新缓冲区:

  1. 新写了一行

  2. 它的 flush() 方法被直接调用,或者当 std::flush()std::endl 被流式传输到它时被调用。

试试这个:

fd1 << x << flush;

或:

fd1 << x;
fd1.flush();

附带说明一下,您真的应该一路检查错误。 std::ofstreamstd::ifstream 构造函数可能无法 create/open 文件。 <<>> 运算符可能无法获得 write/read 值。所有这些操作都可以报告您可以检查的错误。例如:

#include <iostream>
#include <fstream>

int main(int argc, char* argv[])
{
    int x, y;
    std::ofstream fd1(argv[1]);
    std::ifstream fd2(argv[1]);

    if (!fd1.is_open())
    {
        std::cout << "cannot create output file" << std::endl;
    }
    else if (!fd2.is_open())
    {
        std::cout << "cannot open input file" << std::endl;
    }
    else if (!(std::cin >> x))
    {
        std::cout << "invalid input" << std::endl;
    }
    else if (!(fd1 << x << std::flush))
    {
        std::cout << "cannot write to output file" << std::endl;
    }
    else if (!(fd2 >> y))
    {
        std::cout << "cannot read from input file" << std::endl;
    }
    else
    {
        std::cout << "just read " << y << std::endl;
    }

    return 0;
}

或者:

#include <iostream>
#include <fstream>

int main(int argc, char* argv[])
{
    int x, y;

    std::ofstream fd1;
    std::ifstream fd2;

    fd1.exceptions(std::ofstream::failbit);
    fd2.exceptions(std::ifstream::failbit);
    std::cin.exceptions(std::ifstream::failbit);

    try
    {
        fd1.open(argv[1]);
        fd2.open(argv[1]);

        std::cin >> x;

        fd1 << x << std::flush;
        fd2 >> y;

        std::cout << "just read " << y << std::endl;
    }
    catch (const std::ios_base::failure &e)
    {
        std::cout << "error! " << e.what() << std::endl;
    }

    return 0;
}