c++ 从具有相同循环的 ifstream 或 stringstream 中读取

Posted

技术标签:

【中文标题】c++ 从具有相同循环的 ifstream 或 stringstream 中读取【英文标题】:c++ reading from either an ifstream or stringstream with same loop 【发布时间】:2015-09-22 23:39:20 【问题描述】:

我有一个函数需要从 ifstream(磁盘文件中的文本)或 stringstream(内存中的文本)中读取。

这是我想做的一个例子:

void myFunction(bool file,stringstream& ss)
   ifstream inFile;
   string oneline;
   if (file == true)
    //code to open file with inFile
   
   while (getline(file==true?inFile:ss, oneline))
   // ..process lines
   
   ...
   ...

需要说它不会编译。任何人都可以提出一个适当的方法来实现这一点吗?

【问题讨论】:

不要使用file == true。如果file 已经是true,它给你true,如果filefalse,它给你假,所以没有理由这样做,永远。实际上,由于这是 C++,所以file == true 可能会为某些应该被视为正确的值提供错误的结果。 你是说我应该用它来测试布尔值:if(file) 是的。它更简洁,更好的编码风格。 ==!=< 等比较操作都会产生一个布尔值,所以如果你已经有了一个布尔值,就不需要使用比较运算符来获得一个。 【参考方案1】:

所有 iostreams 类都派生自公共基类。输入流均源自istream,输出流均源自ostream。大多数需要处理输入流或输出流(但并不真正关心它是否来自文件、字符串等)的典型函数只处理对istreamostream 的引用,类似这样:

void myFunction(std::istream &is) 
    std::string oneline;
    while (getline(is, oneline))
       process(oneline);


if (file) 
    std::ifstream inFile(filename);
    myFunction(inFile);

else 
    std::istringstream fromMemory(...);
    myFunction(fromMemory);

【讨论】:

我还是一头雾水。 getline(ss, oneline) 工作正常,而 getline(inFile, oneline) 工作正常,但 getline((file)?inFile:ss, oneline)) 失败并出现错误:没有匹配函数调用 'getline(void*, std ::string&)' 我可以用演员表解决这个问题吗?

以上是关于c++ 从具有相同循环的 ifstream 或 stringstream 中读取的主要内容,如果未能解决你的问题,请参考以下文章

C++问题:ifstream流一直找不到文件结束符 while循环一直没有跳出

ifstream() 从字符串变量中获取文件名的 C++ 问题

C ++ ifstream嵌套循环[关闭]

在 C++ 中用于在函数中使用数组,其中使用 ifstream 将数据从 .txt 文件输入到数组中

ifstream 在读取文件 3 次后中断

C++中,ifstream和ofstream定义文件流的区别