cout<<"enter name of file : " <<endl;
char nof[30] ;
for (int i=0;i<20;++i){
cin>>nof[i];
if (nof[i-1]=='x'){
if (nof[i]=='t'){
break;
}
}
}
fstream file1;
file1.open(nof);
if (file1.is_open()) cout<<"file is open"<<endl;
这是一个应该从用户创建文件名的代码 但是我检查了它是否打开了它不是,该怎么办?
答案 0 :(得分:1)
尝试使用:
#include <string>
#include <iostream>
#include <errno.h>
#include <fstream>
#include <cstring>
using namespace std;
int main() {
cout << "Enter the name of the file : ";
string file_name;
getline(cin, file_name);
fstream file_stream;
file_stream.open(file_name);
if (file_stream.is_open()) {
// File Stuffs goes here...........
cout << "The file is open" << endl;
} else {
// The file may not exists or locked by some other process.
cout << strerror(errno) << endl; // Edited this line.
}
}
答案 1 :(得分:1)
处理用户输入的方式使变量My sites
在运行的操作系统上成为无效的文件路径。这就是nof
返回false的原因。
fstream::is_open()
此代码获取用户输入,直到获得for (int i=0;i<20; ++i){
cin >> nof[i];
if (nof[i-1]=='x'){
if (nof[i]=='t'){
break;
}
}
}
。但在C / C ++中,xt
或char*
类型的有效字符串必须以char[]
字符结尾。因此,如果您仍然喜欢处理输入的方式,请在打破循环之前将\0
附加到\0
的末尾。
nof
但我建议您使用for (int i=0;i<20; ++i){
cin>>nof[i];
if (nof[i-1]=='x'){
if (nof[i]=='t'){
nof[i+1]=0; //or nof[i+1]='\0' or nof[i+1]=NULL;
break;
}
}
}
和std::string
代替,上述方式非常尴尬。
getline
答案 2 :(得分:0)
Mohit's answer告诉您如何检测std::fstream::open
的失败。
该函数通常会使用某些操作系统服务来打开一个文件,通常是某些open system call,如Linux上的open(2)(由于多种原因可能会失败)。
您的程序有问题,因为您的nof
可能不包含有效的文件路径。我建议您在阅读之前使用memset(nof, 0, sizeof(nof))
进行清除,并使用调试器,例如gdb
找到你的错误(如果输入的文件名只有三个字符,或四十个字母中的一个,那么你的程序将不起作用)
您可以向操作系统询问该失败的原因。在Linux上,您将使用errno(3)(例如,通过perror(3))。
据我所知,C ++标准没有指定如何查询std::fstream::open
失败的原因(可能不需要fstream
和errno
之间的关系)
讽刺的是,C ++标准不需要std::fstream
来使用操作系统文件。当然,在实践中,fstream
- 总是使用它们。但是原则上你可能在没有文件甚至没有操作系统的情况下有一个C ++ 14实现(但是我不能命名)。
文件的概念实际上与operating systems和file systems紧密相关。您可以拥有没有文件的操作系统(过去,OS/400,PalmOS,GrassHopper和其他学术操作系统),即使今天非常不寻常。
文件的概念特定于操作系统:Windows上的文件与Unix或z/OS上的文件不同。
语言标准规范(如C ++ 11 n3337,C11 n1570,Scheme R5RS)是用英语编写的,它们对“文件”或“文件流”有目的含糊不清(正是因为不同的操作系统对它们有不同的概念)。