我在一段时间内没有编程,我试图在一个项目上工作,该项目将从csv文件中读取推文,然后操作存储的内容。目前,我正试图从文件中提取数据并打印到控制台。我知道我的文件正在打开,因为我包含了一个条件语句,然而,当涉及到读取数据而不是获得任何实际信息时,我只是得到空行。我也认为这可能是因为我正在使用的csv文件相当大(20k数据条目),所以我添加了一个for循环来尝试隔离问题。
我使用getline和stringstream来获取数据,并使用cout来打印到控制台。我就是找不到问题所在。
下面是我的代码:#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string line;
ifstream fin;
fin.open("train_dataset_20k.csv");
if (!fin.is_open()){
cout << "Error opening file" << endl;
return 1;
}
while(fin.is_open()){
for (int i = 0; i <10; i ++){
string Sentiment,id,Date,Query,User,Tweet;
stringstream lineSS(line);
getline(lineSS, Sentiment, ',');
getline(lineSS, id, ',');
getline(lineSS, Date, ',');
getline(lineSS, Query, ',');
getline(lineSS, User, ',');
getline(lineSS, Tweet, 'n');
cout << Sentiment << endl;
cout << id << endl;
cout << Tweet << endl;
}
fin.close();
}
return 0;
}
当前,它将运行for循环10次,但只输出空行,其中没有任何信息。
我知道我的文件正在打开,因为我包含了一个条件语句,然而,当涉及到读取数据而不是获得任何实际信息时,我只是得到空行。
你从来没有在代码的任何地方初始化line
变量,所以lineSS
是用空缓冲区初始化的。
因此,使用std::getline()
读取具有空缓冲区的流将给你一个空字符串,这就是你所面临的。
要解决这个问题,可以将std::getline(fin, line);
放在第二个循环的开头:
// ...
if (fin.is_open()) {
for (int i = 0; i < 10; i ++) {
getline(fin, line); // Reads each line from the file into the 'line' variable
string Sentiment, id, Date, Query, User, Tweet;
stringstream lineSS(line);
getline(lineSS, Sentiment, ',');
getline(lineSS, id, ',');
getline(lineSS, Date, ',');
getline(lineSS, Query, ',');
getline(lineSS, User, ',');
getline(lineSS, Tweet, 'n');
cout << Sentiment << endl;
cout << id << endl;
cout << Tweet << endl;
}
fin.close();
}
// ...
或者直接使用文件流,而不必使用std::stringstream
进行中介:
// ...
if (fin.is_open()) {
for (int i = 0; i < 10; i ++) {
string Sentiment, id, Date, Query, User, Tweet;
getline(fin, Sentiment, ',');
getline(fin, id, ',');
getline(fin, Date, ',');
getline(fin, Query, ',');
getline(fin, User, ',');
getline(fin, Tweet, 'n');
cout << Sentiment << endl;
cout << id << endl;
cout << Tweet << endl;
}
fin.close();
}
// ...