您好我正在尝试将整个文件传递给字符串。这是我的代码,但程序总是在第一个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)。那更好吧?
答案 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;
}