2013-11-06 4 views
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(); 
} 

В приведенной выше программе я считываю значения из входного файла и разбивается на запятую и, наконец, сохраняет значения в векторе.Проблема с итерацией цикла C++

Когда я печатаю вектор, я могу просматривать только первую строку входного файла.

входного файла:

 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 

Проблема: только первая строка печатается

+0

Вы читали только первую строку из файла ввода. Вы намеревались читать больше? – Beta

+0

да, я должен прочитать все строки, как я могу это сделать? – user2748161

+0

'while (! Iss.eof())' - Проблема №1. –

ответ

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

В качестве альтернативы, вы можете избежать использования вложенных в то время как петли общей сложности:

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; 
} 
+0

Он работал хорошо, но он бросает следующее исключение
Terminate вызывается после метания экземпляра «станд :: out_of_range» , что(): вектор :: _ M_range_check Прерванный – user2748161

+0

Изменить выход для контура на то, что у меня есть ('индекс < table.size() ') вместо hardcording' 11' как условие остановки. 'std :: vector :: at()' выполняет проверку диапазона и будет бросать, если вы попытаетесь получить доступ к элементу вне пределов (что, по-видимому, вы делаете). –

0

Вы только прочитать первую строку.

Добавьте цикл с условием, как

while (getline(infile, line)) { 
    ... 
} 
+1

'while (! Infile.eof())' неверно. –

+0

@ ZacHowland заботится о том, чтобы выяснить почему? – Sorin

+0

http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong –

-1

Ваш цикл печати только первые 11 сообщений из массива. Вы должны это до длины массива.

Не знаете, что такое синтаксис для C++ для длины таблицы, но это должно быть проблемой.

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

Длина массива 11. – Beta

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


} 
+0

я добавил в то время как петли и изменил условия по моему для цикла для (Int индекс = 0; table.size(); ++ индекс) , но я получаю сообщение об ошибке: станд :: out_of_range what(): vector :: _ M_range_check – user2748161

+0

вы не хотите делать 'while (! iss.eof())' либо. Переместите getline в условие while, и у вас есть это. –

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

T он будет возвращать false из getline и большинства других операций всякий раз, когда это недействительно. Поэтому, если он не открывается, цикл while не будет работать. И когда он достигнет EOF, цикл while остановится. Гораздо проще читать так, я думаю.

Смежные вопросы