【问题标题】:c++: Reading a file line by linec ++:逐行读取文件
【发布时间】:2012-06-13 07:56:08
【问题描述】:

我想知道是否有 C++ 方法可以打开文件并逐行读取输入。

我遇到了以下完成任务的代码:

#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ifstream myfile;
  myfile.open ("example.txt");
  return 0;
}

我们鼓励我不要使用任何 C 函数或命令。

问题是,我的“example.txt”是一个字符串的形式,而使用str.c_str()是一个C函数,所以我想我有两种方法可以解决这个问题。

还有其他方法可以逐行读取文件中的输入吗?也许使用可以接受字符串作为文件路径参数的东西?有 C++ 做事的方式吗? :)

或者,是否有另一种方法可以将字符串转换为 const char *,这正是 myfile.open() 函数所需要的?

非常感谢!

编辑:由于缺乏实践和研究,我认为 c_str() 是一个 C 函数,但事实并非如此。我很抱歉。因为不是,所以我找到了答案。

【问题讨论】:

  • c_str() 不是 C 函数,它是标准 C++ 库类 (std::string) 的合法成员函数。我不明白你的反对意见。这个问题似乎与您逐行阅读文件问题完全正交,还是我误解了?
  • 您说“完成任务的以下代码:”但您发布的示例没有。复制粘贴错误?
  • 另外,你说“我有两种方法可以解决这个问题”,但你没有说问题是什么,或者你必须用哪两种方法来解决它。
  • 如果我正确阅读了您的问题,您希望完全避免使用像 "example.txt" 这样的字符串文字,对吗?这可能会产生问题。
  • @Mr Lister,没错,但是如果 str.c_str() 不是 C 函数,那么我会使用它。我向大家道歉,这是我的错误。我粘贴的代码是为了说明一行,但我认为粘贴上下文会使事情更清楚。我将编辑帖子。

标签: c++ file-io filepath


【解决方案1】:

C++11 的fstream 构造函数接受string。在大多数情况下,您希望使用fstream 的构造函数,而不是.open() - 您节省了一行代码和一个函数调用。

要逐行读取文件,您应该使用std::getline()

还要注意string::c_str() 仍然是C++ 函数,而不是C 函数,以及fstream 的构造函数采用const char *。大多数(如果不是全部,我也不是 100% 确定)C 标准库函数也包含在 C++ 标准中。

【讨论】:

  • 感谢您的澄清。我想知道是否有 C++ 做事的方式,这似乎是它。谢谢!
【解决方案2】:

由于关于 str.c_str() 的问题已经得到解答,我将添加一些关于逐行获取输入的内容。例如,您想每行输入 2 个整数,提取它们,然后将其放入向量中。

fstream fs(filename.c_str(), ios_base::in);
string line;
stringstream ss;
int a,b;
vector<int> d; 
int numlines;
int i;
for (i = 0; getline(fs, line); i++) {
  for (ss.str(line); ss >> a >> b; d.push_back(a), d.push_back(b)) {}
  ss.clear();
}
numlines = i;

希望您对使用getline()fstream() 有所了解

【讨论】:

    【解决方案3】:

    看起来会非常相似。您需要ifstream 而不是ofstream,您需要&gt;&gt; 运算符,并且假设您的文件不止一行,您将需要一个循环和ifstream::feof() 函数。

    【讨论】:

    • 最好使用std::getline()作为读取函数和循环条件。
    • ifstream 没有 feof() 函数,虽然它的基类 basic_ios&lt;char&gt;eof() 但在循环中使用它几乎总是一个坏主意;通常最好使用某种读取操作的成功或其他方式作为循环条件。 (您可能希望在循环终止后使用eof() 来确定循环是否由于流结束或某些错误而终止,但这是不同的。)
    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2022-01-25
    • 2015-05-19
    相关资源
    最近更新 更多