C ++将文件传递给字符串

时间:2017-06-07 18:23:49

标签: c++

您好我正在尝试将整个文件传递给字符串。这是我的代码,但程序总是在第一个if()上退出。我无法落后于我在这里做错了什么。

#include <iostream>
#include <fstream>
#include <string>

std::string readFile (std::string filename);

int main() {
    std::string filename;
    std::string Eingabestring;

    std::cout << "Geben Sie eine Datei an" << std::endl;
    std::cin >> filename;
    Eingabestring = readFile(filename);

    std::cout << Eingabestring << std::endl;

    return 0;
}

std::string readFile (std::string filename)
{
    std::string zeile,inhalt ;
    std::ifstream quelle;
    quelle.open(filename.c_str());

    if (!quelle)
    {
        std::cerr << filename << " kann nicht geöffnet werden!\n";
        return exit(-1);
    }

    while (!quelle.eof())
    {
        getline(quelle,zeile);
        inhalt = inhalt + zeile;
    }

    return inhalt;

}

已经感谢你的帮助了!

编辑:我刚注意到我把文件放到错误的文件夹中..但代码仍然没有读取整个文件。只是第一行,但我想到循环我可以将我的文件的每一行都放到字符串中?

我修复了第二次返回0以退出(-1)。那更好吧?

2 个答案:

答案 0 :(得分:1)

除了检查注释中所解释的open()失败的原因之外,还要记住,有一种更简单的方法可以检查您在读取的while循环中何时触及文件末尾istream

在C ++中循环和读取istream的惯用方法是嵌入读取表达式,该表达式在循环条件中返回对istream的引用,因此将代码更改为

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
    auto character = char{};
    auto file_string = string{};
    while (cin.get(character)) {
        file_string += character;
    }

    cout << file_string << endl;
    return 0;
}

我上面使用了cin但只是将cin替换为您的文件流对象,一切都应该正常工作。

请注意,while终止条件现在是istream引用,并且可以转换为bool,因此当istream对象读完时,循环将退出当流遇到除EOF之外的任何错误。您不必自己检查eof()

另外一件事是通过const引用而不是按值传递您不打算修改的字符串,因此readFile()函数应该接受const string&而不是string,这将有助于保存字符串复制。当C ++ 17可用时,将const string&替换为std::string_view

答案 1 :(得分:0)

尝试使用类似的内容来阅读您的文件:

std::string readFile (std::string filename)
{
   std::ifstream quelle(filename);

   std::string content( (std::istreambuf_iterator<char>(quelle) ),
                      (std::istreambuf_iterator<char>()) );
   return content;
}