ifstream +打开随机txt文件(c_str)

时间:2017-01-06 19:32:56

标签: c++ ifstream c-str

我想打开一个随机的dt_diff = datetime.date(int(expDate[0]), int(expDate[1]), int(expDate[2])) - datetime.date.today() which_filename = filename if dt_diff < datetime.timedelta(days = 30) else filename2 with open(which_filename, 'a') as f: line = '\n%s %s' % ( IPaddress, cert.replace(':', '=' ).replace('commonName=', '\ncommonName=' ).replace('/', '\n'),) f.write(line) 文件并将数据放入一些字符串中。 如果我将路径写入代码,它就可以工作。

我不知道为什么这不起作用。

.txt

3 个答案:

答案 0 :(得分:2)

您的文件名字符串为空,因为std::string默认为空。

您正在将空字符串(或空字符串)传递给ifstream构造函数,这是最好的,未定义的行为。

答案 1 :(得分:0)

尝试编写如下代码:

#include <iostream>
#include <fstream>

int main()
{
    std::string file;

    std::cout << "Insert Path" << std::endl;
    std::getline(std::cin, file);

    std::cout << file << std::endl;

    std::ifstream filein(file);

    for (std::string line; std::getline(filein, line); )
    {
        std::cout << line << std::endl;
    }

    return 0;
}

值得注意的编辑包括:

  • 我们现在只在我们需要它时构建ifstream对象,在file存储了数据之后,这意味着没有更多未定义的行为,并且我们只在我们之后尝试打开文件知道路径是什么。
  • 我们在存储到file时检索整行,而不只是第一个单词,如果您的路径包含任何空格,这一点至关重要。
  • 我们只是直接使用file字符串。无需拨打c_str()
  • 我们不再使用using namespace std;了。有many, many reasons为什么这是不好的做法。

编辑:

如果你有一个符合C ++ 17的编译器,我建议你编写类似这样的代码:

#include <iostream>
#include <fstream>
//You may need to write #include <experimental/filesystem>
#include <filesystem>
#include <string>

int main()
{
    std::string input_line;

    std::cout << "Insert Path" << std::endl;
    std::getline(std::cin, input_line);

    //You may need to write std::experimental::filesystem
    std::filesystem::path file_path{input_line};
    //This will print the "absolute path", which is more valuable for debugging purposes
    std::cout << std::filesystem::absolute(file_path) << std::endl;

    std::ifstream filein(file_path);

    for (std::string line; std::getline(filein, line); )
    {
        cout << line << endl;
    }

    return 0;
}

明确使用path个对象将使您的代码更具可读性并使错误更加明确,并授予您访问您无法访问的行为的权限。

答案 2 :(得分:0)

首先你打开什么?只要你的字符串不包含任何内容??

秒,即使字符串包含有效路径并且第一次打开成功,但只要在多个文件上使用相同的文件流而不清除其缓冲区并关闭上一个文件,第二次将失败: / p>

db = client.my_database
collection = db.my_collection