0
#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

问题:只打印第一行

4

5 回答 5

3

我建议像这样重写它:

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 循环将停止。我认为以这种方式阅读要简单得多。

于 2013-11-06T18:32:35.587 回答
1

您只读取了文件的一行

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);
   }


 }
于 2013-11-06T18:30:10.193 回答
1

您有几个问题,解决如下:

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;
}
于 2013-11-06T18:34:18.313 回答
0

您只阅读了第一行。

添加一个带有类似条件的循环

while (getline(infile, line)) {
    ...
}
于 2013-11-06T18:28:37.423 回答
-1

您的 for 循环仅打印数组中的前 11 个帖子。你应该把它放在数组的长度上。

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

  for(int index=0; index<table.size(); ++index)
         {
            cout<< "Element" << index << ":" << table.at(index) << endl ;
         }
于 2013-11-06T18:29:00.003 回答