fstream 没有在 C++ 中创建文件
fstream is not creating a file in C++
我在 SO 上检查了几个这样的问题,例如:
Link 1 and Link 2
但是 none 他们的回答对我有帮助。在调试了这么多小时之后,我无法检测到错误。
所以,我在这里再次提问。
我的程序代码是:
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
int main(){
ofstream file;
file.open("data.dat",fstream::out);
file<<fflush;
if(!file)
cout<<"error"<<strerror(errorno);
file.close();
return 0;
}
这是处理文件处理的程序的主干。该程序的其余部分处理一些数据并将其写入文件,我认为这既不相关也不影响文件处理。
有趣的是程序没有闪烁任何错误。
int main(){
ofstream file;
file.open("data.dat") // no need to call for ofstream ->fstream::out
// file<<fflush; fflush won't work since there is nothing unwriten
if(!file.is_open()) // use is_open();
cout<<"error"<<strerror(errorno);
// write something to file
file << " ";
file.close();
return 0;
}
您的代码通常只需稍作改动即可工作,该文件只是在您的程序所在的当前工作目录中创建的 运行,而不是在可执行文件所在的目录中。还有很多其他的东西你可能想解决:
#include <iostream>
#include <fstream>
// if including things from the C standard library in a C++ program,
// use c[header] instead of [header].h; you don't need any here though.
using namespace std;
int main()
{
// no need to call open(), the constructor is overloaded
// to directly open a file so this does the same thing
ofstream file("data.dat");
if(!file)
{
cout << "Couldn't open file" << endl;
return 1;
}
file.close();
// return 0; is not needed, your program will automatically
// do this when there is no return statement
}
有关无法打开文件的详细信息,您可以查看std::basic_ios::bad()
and std::basic_ios::fail()
。使用 C++ 流进行文件处理时,检查 errno
不是您想要做的。
#include <iostream>
#include <fstream>
#include <string.h>
#include <errno.h>
int main (int argc, char* argv[])
{
std::ofstream file;
file.open("data.dat", std::fstream::out);
file << "Hello" << std::endl;
if (!file)
std::cout << "error" << strerror(errno);
file.close();
return 0;
}
主要区别:
- 你没有
#include <errno.h>.
- 您将 "errorno" 传递给 strerror(),而不是 "errno,",这是正确的数字。
这适用于 Ubuntu 14.04(64 位)。我使用没有标志的 g++ 编译。
此外,我建议您永远不要使用 using namespace std; 一旦您开始与其他库集成,例如 Boost(Boost 的库可以重叠具有每个 C++ 标准库功能)。
如果文件被打开,您可以在GDB
和procfs
的帮助下找到它的位置。只需在文件打开但尚未关闭的地方放置一个断点。 运行调试器上的程序,直到触发断点。然后使用以下命令:
ls -l /proc/<pid>/fd
其中 <pid>
是程序的 PID
。文件的完整路径应该在输出的某处。
我在 SO 上检查了几个这样的问题,例如: Link 1 and Link 2
但是 none 他们的回答对我有帮助。在调试了这么多小时之后,我无法检测到错误。 所以,我在这里再次提问。
我的程序代码是:
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
int main(){
ofstream file;
file.open("data.dat",fstream::out);
file<<fflush;
if(!file)
cout<<"error"<<strerror(errorno);
file.close();
return 0;
}
这是处理文件处理的程序的主干。该程序的其余部分处理一些数据并将其写入文件,我认为这既不相关也不影响文件处理。
有趣的是程序没有闪烁任何错误。
int main(){
ofstream file;
file.open("data.dat") // no need to call for ofstream ->fstream::out
// file<<fflush; fflush won't work since there is nothing unwriten
if(!file.is_open()) // use is_open();
cout<<"error"<<strerror(errorno);
// write something to file
file << " ";
file.close();
return 0;
}
您的代码通常只需稍作改动即可工作,该文件只是在您的程序所在的当前工作目录中创建的 运行,而不是在可执行文件所在的目录中。还有很多其他的东西你可能想解决:
#include <iostream>
#include <fstream>
// if including things from the C standard library in a C++ program,
// use c[header] instead of [header].h; you don't need any here though.
using namespace std;
int main()
{
// no need to call open(), the constructor is overloaded
// to directly open a file so this does the same thing
ofstream file("data.dat");
if(!file)
{
cout << "Couldn't open file" << endl;
return 1;
}
file.close();
// return 0; is not needed, your program will automatically
// do this when there is no return statement
}
有关无法打开文件的详细信息,您可以查看std::basic_ios::bad()
and std::basic_ios::fail()
。使用 C++ 流进行文件处理时,检查 errno
不是您想要做的。
#include <iostream>
#include <fstream>
#include <string.h>
#include <errno.h>
int main (int argc, char* argv[])
{
std::ofstream file;
file.open("data.dat", std::fstream::out);
file << "Hello" << std::endl;
if (!file)
std::cout << "error" << strerror(errno);
file.close();
return 0;
}
主要区别:
- 你没有
#include <errno.h>.
- 您将 "errorno" 传递给 strerror(),而不是 "errno,",这是正确的数字。
这适用于 Ubuntu 14.04(64 位)。我使用没有标志的 g++ 编译。
此外,我建议您永远不要使用 using namespace std; 一旦您开始与其他库集成,例如 Boost(Boost 的库可以重叠具有每个 C++ 标准库功能)。
如果文件被打开,您可以在GDB
和procfs
的帮助下找到它的位置。只需在文件打开但尚未关闭的地方放置一个断点。 运行调试器上的程序,直到触发断点。然后使用以下命令:
ls -l /proc/<pid>/fd
其中 <pid>
是程序的 PID
。文件的完整路径应该在输出的某处。