'cout'未在此范围错误中声明

时间:2013-08-19 21:28:58

标签: c++ ifstream getline

我尝试使用getline从文件中读取行,然后显示每一行。但是,没有输出。输入文件是lorem ipsum虚拟文本,每个句子都有新行。这是我的代码:

#include <vector>
#include <string>
#include <fstream>
#include <iostream>

using namespace std;

int main() {

    string line;
    vector<string> theText;
    int i = 0;
    ifstream inFile("input.txt");

    if(!inFile)
        cout << "Error: invalid/missing input file." << endl;
    else {
        while(getline(inFile, line)) {
            theText[i] = line;
            theText[i+1] = "";
            i += 2;
        }

        //cout << theText[0] << endl;
        for (auto it = theText.begin(); it != theText.end() && !it->empty(); ++it)
            cout << *it << endl;
    }
    return (0);
}

3 个答案:

答案 0 :(得分:2)

vector<string> theText;
...
while(getline(inFile, line)) {
    theText[i] = line;
    theText[i+1] = "";
    i += 2;
}

第一行声明一个空向量。要向其添加项目,您需要调用push_back(),而不是简单地分配其索引。在向量末尾分配索引是非法的。

while(getline(inFile, line)) {
    theText.push_back(line);
    theText.push_back("");
}

答案 1 :(得分:2)

vector<string> theText;

声明一个空矢量。

theText[i] = line;

尝试访问向量中不存在的元素。

就像std::vector::operator[]文档中所述:

  

返回对指定位置pos处元素的引用。 无法执行边界检查。

因此,即使您访问向量的非现有元素(索引越界),您也不会有任何错误(除非可能是段错误...)。

您应该使用std::vector::push_back向元素添加元素:

while(getline(inFile, line)) {
    theText.push_back(line);
    theText.push_back("");
}

除了问题:

你可以从最后一个循环删除&& !it->empty(),它没用。如果向量为空begin(),则返回end(),代码永远不会进入循环。

答案 2 :(得分:1)

push_back用于thetext向量

您正在对空矢量进行索引

   while(getline(inFile, line)) {

        theText.push_back(line);
        theText.push_back("\n");
    }

同时从for循环中删除!it->empty()

    for (auto it = theText.begin(); it != theText.end() ; ++it)
        cout << *it << endl;

使用-std=c++0x-std=c++11选项进行编译。