循环迭代问题c ++

时间:2013-11-06 18:22:33

标签: c++

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>

using namespace std;

int main()
{
    string line;
    ifstream infile ("Input.csv");
    vector<string> table;
    string word;
    if(infile.is_open())
    {
        getline(infile,line);
        istringstream iss(line);

        while(!iss.eof())
        {
            getline(iss,word, ',');
            table.push_back(word);
        }
    }

    for(int index=0; index<11; ++index)
    {
        cout<< "Element" << index << ":" << table.at(index) << endl ;
    }
    infile.close();
}

在上面的程序中,我正在从输入文件读取值并基于逗号分割,最后将值存储到矢量中。

当我打印矢量时,我只能查看输入文件的第一行。

输入文件:

     CountryCode,Country,ItemCode,Item,ElementGroup,ElementCode,Element,Year,Unit,Value,Flag
     100,India,3010,Population - Est. & Proj.,511,511,Total Population - Both sexes,1961,1000,456950,
     100,India,3010,Population - Est. & Proj.,511,511,Total Population - Both sexes,1962,1000,466337,
     100,India,3010,Population - Est. & Proj.,511,511,Total Population - Both sexes,1963,1000,476025,
     100,India,3010,Population - Est. & Proj.,511,511,Total Population - Both sexes,1964,1000,486039,

输出:

  Element0:CountryCode
  Element1:Country
  Element2:ItemCode
  Element3:Item
  Element4:ElementGroup
  Element5:ElementCode
  Element6:Element
  Element7:Year
  Element8:Unit
  Element9:Value
  Element10:Flag

问题:仅打印第一行

5 个答案:

答案 0 :(得分:2)

我建议像这样重写:

int main()
{
    string line;
    ifstream infile ("Input.csv");
    vector<string> table;
    string word;
    while(getline(infile, line))
    {
        istringstream iss(line);

        while(getline(iss,word, ','))
        {
            table.push_back(word);
        }
    }

    for(int index=0; index<11; ++index)
    {
        cout<< "Element" << index << ":" << table.at(index) << endl ;
    }
    infile.close();
}

只要无效,流就会从getline和大多数其他操作返回false。因此,如果它没有打开,while循环将不会运行。当它到达EOF时,while循环将停止。我认为这种方式更容易阅读。

答案 1 :(得分:0)

你只读了第一行。

添加一个类似

的循环
while (getline(infile, line)) {
    ...
}

答案 2 :(得分:0)

您只读取文件的一行

if(infile.is_open())
 {
  getline(infile,line);
  istringstream iss(line);

   while(!iss.eof())
   {
     getline(iss,word, ',');
     table.push_back(word);
   }


 }

如果您需要阅读文件的所有行,那么您可以改为编写

while (getline(infile,line))
 {
  istringstream iss(line);

   while(!iss.eof())
   {
     getline(iss,word, ',');
     table.push_back(word);
   }


 }

答案 3 :(得分:0)

您有几个问题,如下所述:

int main()
{
    std::string line;
    std::ifstream infile ("Input.csv");
    std::vector<std::string> table;
    while (std::getline(infile, line)) // this is the loop you want to read the file
    {
        std::istringstream iss(line);
        std::string word;
        while (std::getline(iss, word, ',')) // there are better ways to do this, but this will work
        {
            table.push_back(word);
        }
    }    

    for(int index=0; index<table.size(); ++index) // loop through the whole size
    {
        std::cout<< "Element" << index << ":" << table[index] << std::endl ;
    }

    infile.close();
    return 0;
}

或者,您可以完全避免使用嵌套的while循环:

struct csv_reader : std::ctype<char>
{
    csv_reader() : std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask());
        rc['\n'] = std::ctype_base::space;
        rc[','] = std::ctype_base::space;
        return &rc[0];
    }
};

int main()
{
    std::string line;
    std::ifstream infile ("Input.csv");
    csv_reader reader;
    infile.imbue(std::locale(std::locale(), &reader);
    std::vector<std::string> table{std::istream_iterator<std::string>(infile), std::istream_iterator<std::string>()};
    // or 
    //std::vector<std::string> table;
    //std::copy(std::istream_iterator<std::string>(infile), std::istream_iterator<std::string>(), std::back_inserter(table)); 

    for(int index=0; index<table.size(); ++index) // loop through the whole size
    {
        std::cout<< "Element" << index << ":" << table[index] << std::endl ;
    }

    infile.close();
    return 0;
}

答案 4 :(得分:-1)

你的for循环只打印数组中的前11个帖子。 你应该把它放到阵列的长度上。

不确定c ++的语法对于表的长度是什么,但这应该是问题。

  for(int index=0; index<table.size(); ++index)
         {
            cout<< "Element" << index << ":" << table.at(index) << endl ;
         }