我的c ++文件没有打开,为什么?

时间:2018-03-24 07:33:47

标签: c++ file

 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;

这是一个应该从用户创建文件名的代码 但是我检查了它是否打开了它不是,该怎么办?

3 个答案:

答案 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 ++中,xtchar*类型的有效字符串必须以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失败的原因(可能不需要fstreamerrno之间的关系)

讽刺的是,C ++标准不需要std::fstream来使用操作系统文件。当然,在实践中,fstream - 总是使用它们。但是原则上你可能在没有文件甚至没有操作系统的情况下有一个C ++ 14实现(但是我不能命名)。

文件的概念实际上与operating systemsfile systems紧密相关。您可以拥有没有文件的操作系统(过去,OS/400PalmOS,GrassHopper和其他学术操作系统),即使今天非常不寻常。

文件的概念特定于操作系统:Windows上的文件与Unixz/OS上的文件不同。

语言标准规范(如C ++ 11 n3337,C11 n1570,Scheme R5RS)是用英语编写的,它们对“文件”或“文件流”有目的含糊不清(正是因为不同的操作系统对它们有不同的概念)。