写入文件后立即从文件中读取
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
在以下情况下刷新缓冲区:
新写了一行
它的 flush()
方法被直接调用,或者当 std::flush()
或 std::endl
被流式传输到它时被调用。
试试这个:
fd1 << x << flush;
或:
fd1 << x;
fd1.flush();
附带说明一下,您真的应该一路检查错误。 std::ofstream
和 std::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;
}
我想写入文件然后从中读取并打印结果
这是我的代码
#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
在以下情况下刷新缓冲区:
新写了一行
它的
flush()
方法被直接调用,或者当std::flush()
或std::endl
被流式传输到它时被调用。
试试这个:
fd1 << x << flush;
或:
fd1 << x;
fd1.flush();
附带说明一下,您真的应该一路检查错误。 std::ofstream
和 std::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;
}