2014-09-21 52 views
-1

我工作的文件IO的结束,我已经成功地从文件到我所做的矢量获取数据,但是当我打印值,我拿到后垃圾号码数据的最后部分。所以我猜测,不存在到载体的推动值,或者其试图打印不存在矢量的部分。任何帮助都会很棒。循环将不仅仅停留在文件

的main.cpp

#include <iostream> 
#include <sstream> 
#include <fstream> 
#include <vector> 
#include <string> 
#include "store.h" 

using namespace std; 

int main() 
{ 
    store data; 
    ifstream inFile ("C:/Users/Owner/Desktop/Albums.csv"); 
    string line; 
    string item; 
    int num; 
    int itemnum; 
    int linenum = 1; 
    ostringstream convert; 
    string temp; 
    while (!inFile.eof()) 
    { 
     while (getline (inFile, line)) 
     { 
      istringstream linestream(line); 
      itemnum = 0; 
      num = 0; 
      convert << linenum; 
      temp = convert.str(); 
      data.addtovectv(temp); 
      while (getline (linestream, item, ',')) 
      { 
       if (itemnum == 1 || itemnum == 2 || itemnum == 3 || itemnum == 5) 
       { 
        num++; 
        data.addtovectfullline(0, item); 
       } 
       itemnum++; 
      } 
      linenum++; 
     } 
    } 
    data.print(); 
    inFile.close(); 
    return 0; 
} 

store.h

#ifndef STORE_H 
#define STORE_H 

#include <iostream> 
#include <sstream> 
#include <fstream> 
#include <vector> 
#include <string> 
using namespace std; 

class store 
{ 
    public: 
     store(); 
     void addtovectv(string); 
     void addtovectfullline(int, string); 
     void print(); 

    private: 
     vector<string> v; 
     vector< vector<string> > fullline; 
}; 

#endif 

store.cpp

#include "store.h" 

store::store() 
{ 

} 
void store::addtovectv(string a) 
{ 
    v.push_back(a); 
    fullline.push_back(v); 
} 
void store::addtovectfullline(int a, string c) 
{ 
    fullline[a].push_back(c); 
} 
void store::print() 
{ 
    for(unsigned int i=0; i<fullline.size(); i++) 
    { 
     for(unsigned int j=0; j<fullline[i].size(); j++) 
     { 
      cout << fullline[i][j] << endl; 
     } 
     cout << endl; 
    } 
} 

编辑:一些示例数据

RS 500汇编,群星,太阳纪录集团上,308

两个列表,调用任务,低端理论,1991年,154,扎,的Skeff安瑟伦,Zombart JK,USA一个部落,48:08:52

两个列表,AC/DC, Back to Black,1980,73,ATCO,Robert John Lange,Bob Defrin,澳大利亚/英国,41:36:52

这两个清单,AC/DC,公路到地狱,1979,199,Albert Productions,Robert John兰格,鲍勃Defrin澳大利亚/英国,41:53:52

我需要读取的行,但只把第二,第三,第四和第六条信息到矢量,这是它应该最终印刷,与每个人新的一行上的残余物。所有数据都存储在一个.csv文件

这个样本数据,我的输出是这样的截图:http://puu.sh/bHtHM.png 但是,没有这些数字的底部应该在那里,并且在第一组后一个奇怪的空间数据

EDIT2的:意识到奇怪的空间是一个没有我要求的数据,所以它的精细

+0

请提供一个例子输入和预期与实际输出。 – 2014-09-21 03:07:50

+0

好吧,是否这样做,对不起 – 2014-09-21 03:32:10

+2

请更清楚您输出的确切格式。只需粘贴它,逐字。 – 2014-09-21 03:48:01

回答

0

In.good()是不恰当的方式告诉如果该文件已经完成。

(来自http://www.cplusplus.com/reference/ios/ios/good/

Ios::eof()检查文件的末尾。

Ios::Good()检查在开放没有任何错误。当读取过去EOF发生错误,它可能退出循环。

+0

我试着将它改为!inFile.eof(),但是做了同样的工作 – 2014-09-21 02:57:31

+0

我认为问题来自第二个getline。可能有不均匀的线条数量,并且由于它不检查EOF,它会超出边界。 – 2014-09-21 03:03:58

+0

好吧,我为该getline添加了一个EOF检查,但现在它启动并且从不打印任何数据,甚至不会结束程序 – 2014-09-21 03:07:35

0

不幸的是,你有什么错误的想法“!InFile.eof()”正在做,但不用担心,因为这是大多数编程课一大误解。

觉得“文件检查结束”作为一个for循环的:

for(int i = 0; i != end of file; i++) 
{ 
    getinput(); 
} 

它将始终读取一行通过文件的结尾,因为它如果当前的线不能因读取器只检查它在文件的末尾,然后递增,如果不是。这就是为什么你看到人们使用:

while(InFile>>variable)



while(getline(InFile,variable))

而不是

while(!InFile.eof())