为什么这个for循环不执行?

时间:2010-05-02 01:18:19

标签: c++ for-loop getline

我正在编写一个练习程序,该程序将从文件中读取数据并将其格式化为可读。到目前为止,我有一些代码可以将标题与其下的数据分开。这是:

int main() {
    ifstream in("records.txt");
    ofstream out("formatted_records.txt");
    vector<string> temp;
    vector<string> headers;
    for (int i = 0; getline(in,temp[i]); ++i) {
        static int k = -1;
        if (str_isalpha(temp[i])) {
            headers[++k] = temp[i];
            temp.erase(temp.begin() + i);
        }
        else {
            temp[i] += "," + headers[k];
        }
    }
}

str_isalpha()只是一个将isalpha()应用于字符串中每个字符的函数。)现在,这个程序中的for循环不执行,我无法弄清楚为什么。有人知道吗?

编辑:根据建议,我将其更改为

string line;
for (int i = 0; getline(in,line); ++i) {
    temp.push_back(line);

仍然完全跳过for循环。

2 个答案:

答案 0 :(得分:5)

vector<string> temp;生成向量。当您尝试读入temp[0]时,这是未定义的行为。您应该将getline的第二个参数作为单独的string变量传递,在循环之前说string foo;,然后将temp.push_back(foo);作为循环体中的第一条指令。

答案 1 :(得分:4)

如果在确保您正在读取有效的字符串引用后循环仍未运行,则应检查您正在读取的流是否有效。例如,如果文件不存在或者您没有读取权限,则流将无效。当流无效时,getline将无法读取任何内容。它的返回值是相同的流,当转换为bool时,它的计算结果为false。在继续之前检查流的状态。

ifstream in("records.txt");
if (!in.is_open()) {
  std::cerr << "Uh-oh.\n";
  return EXIT_FAILURE;
}