我正在进行一项任务,我需要将未知行数的CSV文件读入结构化数组。只能通过C ++,而不是C(他们不希望我们将两者结合起来)。
所以,我有以下代码:
// DEFINITION
struct items {
int ID;
string name;
string desc;
string price;
string pcs;
};
void step1() {
string namefile, line;
int counter = 0;
cout << "Name of the file:" << endl;
cin >> namefile;
ifstream file;
file.open(namefile);
if( !file.is_open()) {
cout << "File "<< namefile <<" not found." << endl;
exit(-1);
}
while ( getline( file, line) ) { // To get the number of lines in the file
counter++;
}
items* item = new items[counter]; // Add number to structured array
for (int i = 0; i < counter; i++) {
file >> item[i].ID >> item[i].name >> item[i].desc >> item[i].price >> item[i].pcs;
}
cout << item[1].name << endl;
file.close();
}
但是当我运行代码时,应用程序会在阅读后返回空格,而我实际上认为它根本不会读取。以下是控制台中的输出:
Name of the file:
open.csv
Program ended with exit code: 0
答案 0 :(得分:1)
您的第一个循环读取流。当没有其他东西可供阅读时它停止。此时,流进入故障模式(即std::ios_base::failbit
被设置),它将拒绝读取任何内容,直到它以某种方式恢复。
您可以使用file. clear()
将文件恢复为goid状态。然而,仅仅这一点无济于事,因为流仍在结束。你可以在阅读之前寻求开始,但我不会这样做。相反,我会一次性阅读该文件,并将push_back()
每个元素读取到std::vector<items>
。
请注意,您对每个items
记录的输入可能并不完全符合您的要求:如果您确实有CSV文件,则需要读取分隔符(例如{ {1}})并在读取ID后忽略分隔符。此外,您应该在阅读后始终测试流的状态。你的循环可以是看起来像这样:
,
确切需要什么取决于确切的文件格式。
答案 1 :(得分:0)
您的文件指针位于while循环后的文件末尾,以确定行数。在我看来,你已经清除并重置文件指针。此链接可能会对您有所帮助:http://www.cplusplus.com/forum/beginner/11564/