此代码旨在输出Hello World。但它输出0x22fed8 我正在学习C++中的文件处理,但是这里有个问题。我正在读一个文件。 此代码旨在输出Hello World。但它输出0x22fed8 #include <iostream> #include <fstream> using namespace std; int main() { fstream file; file.open("test.txt",ios::in|ios::out); file << "Hello World"; cout << file; file.close(); return 0; } #包括 #包括 使用名称空间std; int main() { 流文件; 打开(“test.txt”,ios::in | ios::out); 文件

此代码旨在输出Hello World。但它输出0x22fed8 我正在学习C++中的文件处理,但是这里有个问题。我正在读一个文件。 此代码旨在输出Hello World。但它输出0x22fed8 #include <iostream> #include <fstream> using namespace std; int main() { fstream file; file.open("test.txt",ios::in|ios::out); file << "Hello World"; cout << file; file.close(); return 0; } #包括 #包括 使用名称空间std; int main() { 流文件; 打开(“test.txt”,ios::in | ios::out); 文件,c++,C++,让我们检查一下这行 cout << file; cout-temp; 不能包含 #包括 int main(int,char**) { std::ifstream输入(“test.txt”); 字符c; while(输入>>c){ std::cout根据mrree的建议编辑: ifstream fin("file.txt"); if (fin.is_open() == false) { // error } string line; while( getline(fin,

让我们检查一下这行

cout << file;
cout-temp;
不能包含
#包括
int main(int,char**)
{
std::ifstream输入(“test.txt”);
字符c;
while(输入>>c){

std::cout根据mrree的建议编辑:

ifstream fin("file.txt");

if (fin.is_open() == false) {
  // error
}

string line;

while( getline(fin, line) ) {  
  cout << line;
}
ifstream-fin(“file.txt”);
if(fin.is_open()==false){
//错误
}
弦线;
while(getline(fin,line)){
库特简单解
正如其他人所指出的,直接将文件打印到流中是行不通的。打印文件内容需要打开另一个从文件中读取的流,或者将流的读取指针重新设置为开头,然后再次读取整个文件(如其他人所示)

C++不会自动执行此操作,但您可以手动执行此操作(此处,打开一个新流):

现在,将文件内容写入另一个流是一个简单的添加。不必写入文件,只需写入文件缓冲区:

cout << ifs.rdbuf() << endl;
当出现读取错误时,这个代码会产生一个无休止的循环。这种情况发生在很多情况下。例如,在读取文件时删除文件,或者删除包含该文件的USB设备或文件格式错误。所有这些情况都会在这里创建无限循环。在溪流中

很幸运,这个问题的解决方法也很简单。此外,它解释了为什么你的原始代码产生了如此奇怪的结果。事实上,C++中的流有一个隐式转换为<代码> BOOL 类。 这使得测试流是否处于有效状态(而不是处于结束状态)以及是否可以安全地从中读取变得容易。因此,我们可以适当地重新格式化循环:

while (file) …
上述代码依赖于到
void*
的转换。任何非
null
指针都指示有效流。现在,代码中也会发生同样的情况:

cout << file;

你知道吗,
而(!file.eof())
循环总是断开的,对吗?
失败位和
坏位必须测试得很好!!!实际上我没有:(.我对iostream的了解充其量是微乎其微的。从…可能是sophmoore大学的一年开始,我就没有做过有意义的工作。你可以不循环文件,而是直接将cout cout file.rdbuf()刷新到磁盘上。当然,这并不是一个简单的例子。但如果他在写更多的数据…你也可以说:ifstream fin(“file.txt”)。您可以使用while(fin){getline();coutfile.rdbuf()进行测试可能已经被刷新到磁盘上了。当然,这并不是一个简单的例子。但是如果他正在写更多的数据…mree:哇,很好的观点。我实际上误读了从文件中读取的代码。现在,写入它是一个完全不同的问题。基本上,最好是制作一个带有两个接收器的iostream(Boost.Iostreams,有人吗?).1这是我认为的答案。虽然在某些情况下,.eof的测试可能很有用(例如,在“(stream>>foo>>ws)和&stream.eof()”),但在这种情况下,它当然是错误的。不过,很遗憾,你本可以解释“while(file)”工作的原因(操作符void*())在同一句话中,他解释了他输出的奇怪的十六进制数:)Weeell,你终于实现了你的愿望。现在还不清楚你想做什么。按照我的理解,你试图将“hello world”写入标准输出(控制台)和文件test.txt。(这似乎毫无意义)或者您只是试图写入文件,在这种情况下,
cout
根本不应该存在。或者您试图从文件中读取数据,并将其打印到标准输出?(在这种情况下,“hello world”字符串不应该存在)您到底想做什么?
ifstream fin("file.txt");

if (fin.is_open() == false) {
  // error
}

string line;

while( getline(fin, line) ) {  
  cout << line;
}
ifstream ifs("filename");
cout << ifs.rdbuf() << endl;
while ( !file.eof() )
while (file) …
cout << file;
cout << static_cast<void*>(file);
#include <iostream>
#include <fstream>

struct sinkpair {
    sinkpair(std::ostream& a, std::ostream& b) : a(a), b(b) { }

    // Forward all ouputs to both streams.
    template <typename T>
    sinkpair& operator <<(T const& value) {
        a << value;
        b << value;
        return *this;
    }

    // Explicit overload needed for manipulators such as `endl`.
    sinkpair& operator <<(std::ostream& (*manip)(std::ostream&)) {
        a << manip;
        b << manip;
        return *this;
    }

private:
    std::ostream& a;
    std::ostream& b;
};

int main() {
    std::ofstream ofs("test.txt");
    sinkpair sp(std::cout, ofs);
    sp << "Hello" << std::endl;
}