我正在处理文件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
两个名单,A Tribe Called Quest,The Low End Theory,1991,154,Jive,Skeff Anselm,Zombart JK,USA,48:08:52
两个名单,AC / DC,Back in Black,1980,73,ATCO,Robert John Lange,Bob Defrin,Australia / UK,41:36:52
两个名单,AC / DC,Highway to Hell,1979,199,Albert Productions,Robert John Lange,Bob Defrin Australia / UK,41:53:52
我需要阅读这些行,但只将第二,第三,第四和第六条信息放入向量中,这应该是最终打印的内容,每个单独的部分都在新行上。所有数据都存储在.csv文件中
使用此示例数据,我的输出是此屏幕截图:http://puu.sh/bHtHM.png 但是,底部的数字都不应该存在,并且在第一组数据之后有一个奇怪的空间
edit2:意识到奇怪的空间是我要求的数据的缺失,所以很好
答案 0 :(得分:0)
In.good()
不是判断文件是否完成的适当方式。
(来自http://www.cplusplus.com/reference/ios/ios/good/)
Ios::eof()
检查文件结尾。
Ios::Good()
检查打开时没有错误。当读取过去EOF
时发生错误时,它可能会退出循环。
答案 1 :(得分:0)
不幸的是,你错误地认识到了什么&#34;!InFile.eof()&#34;正在做但不要担心,因为这在大多数编程课程中都是一个很大的误解。
想想&#34;文件结束检查&#34;作为for循环:
for(int i = 0; i != end of file; i++)
{
getinput();
}
它总是读取一行传递到文件的末尾,因为它只检查当前行是否由于它位于文件的末尾而无法读取,然后如果不是则递增。这就是你看到人们使用的原因:
while(InFile>>variable)
或
while(getline(InFile,variable))
而不是
while(!InFile.eof())