我一直试图在没有运气的情况下麻烦拍摄这段代码几天。我正在尝试读取看起来像这样的CSV文件(用逗号分隔)。我想输出100点(第二行第二列)。
apple,party11,
0,0.1,
0.1,**100**,
//-Line 4 is empty-
我的代码:
void Info() {
Input1 = CSVfile("File1.csv");
Input2 = CSVfile("File2.csv");
}
double CSVfile(string cvsfilein) {
ifstream file;
file.open(cvsfilein);
if (file.fail()) {
printf("----------Error no CSV File----------------");
return 0;
}
vector<vector<string>> csvfile;
double needvalue;
while (file) {
string filevalue1;
if (!getline(file, filevalue1)) {
cout << "failed heree1 " << endl;
return -2;
break;
}
** // Never get past here**
cout
<< "filevalue1 " << filevalue1 << endl;
istringstream iss(filevalue1);
vector<string> record;
while (iss) {
string filevalue2;
if (!getline(iss, filevalue2, ',')) {
if (filevalue2.empty())
continue;
cout << "failed heree2 " << endl;
return -2;
break;
}
record.push_back(filevalue2);
cout << "filevalue2 " << filevalue2 << endl;
}
csvfile.push_back(record);
needvalue = atof(record[3].c_str()); // Converts the string to number
cout << needvalue << endl; // just to check
return needvalue;
file.close();
}
}
如果(!getline(file, filevalue1))
我似乎永远不会通过第一个。我已经尝试使用if (filevalue1.empty()) continue;
并且似乎没有继续代码..只是停止它。
答案 0 :(得分:0)
主要问题是file.close()
的位置,次要问题涉及各种无法访问的代码。这个经过温和修改的代码版似乎可以工作,甚至可以防止在文件末尾的空行崩溃 - 我使用了两个相同的数据文件。
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
double CSVfile(string cvsfilein);
void Info();
double Input1;
double Input2;
void Info() {
Input1 = CSVfile("File1.csv");
Input2 = CSVfile("File2.csv");
}
double CSVfile(string cvsfilein) {
ifstream file;
file.open(cvsfilein);
if (file.fail()) {
cerr << "----------Error no CSV File----------------\n";
return 0;
}
vector<vector<string>> csvfile;
while (file) {
string filevalue1;
if (!getline(file, filevalue1)) {
cerr << "failed heree1 " << endl;
return -2;
break;
}
cout << "filevalue1 " << filevalue1 << endl;
istringstream iss(filevalue1);
vector<string> record;
while (iss) {
string filevalue2;
if (!getline(iss, filevalue2, ',')) {
if (filevalue2.empty())
continue;
cerr << "failed heree2 " << endl;
return -2;
}
record.push_back(filevalue2);
cout << "filevalue2 " << filevalue2 << endl;
}
csvfile.push_back(record);
//double needvalue = atof(record[3].c_str()); // Converts the string to number
//cout << needvalue << endl; // just to check
//return needvalue;
//file.close();
}
file.close();
return 0;
}
int main()
{
Info();
return 0;
}
示例输出:
filevalue1 apple,party11,
filevalue2 apple
filevalue2 party11
filevalue1 0,0.1,
filevalue2 0
filevalue2 0.1
filevalue1 0.1,100,
filevalue2 0.1
filevalue2 100
filevalue1
failed heree1
filevalue1 apple,party11,
filevalue2 apple
filevalue2 party11
filevalue1 0,0.1,
filevalue2 0
filevalue2 0.1
filevalue1 0.1,100,
filevalue2 0.1
filevalue2 100
filevalue1
failed heree1
needvalue
计算在空行上崩溃程序(取消引用从strtod()
内调用的atof()
中的空指针)。那是因为没有record[3]
条目转换为字符串 - 这不是不合理的。
答案 1 :(得分:0)
它也适用于我(直到从字符串转换为双倍)。
所有getline的Firts返回一个istream&amp;所以不要把它放在if。
中现在,如果&#34;失败了heree1&#34;在所有使用中都没有打印错误试试&amp;渔获物。
此外,检查错误位:
try {
getline(file, filevalue1);
} catch(ifstream::failure e) {
cerr << "Exception happened: " << e.what() << endl
<< "Error bits are: "
<< "\nfailbit: " << file.fail()
<< "\neofbit: " << file.eof()
<< "\nbadbit: " << file.bad() << endl;
}
eofbit - 在操作过程中到达字符源的结尾 failbit - 获取的输入无法解释为此类对象的有效文本表示形式。请注意,一些eofbit案例也会设置failbit badbit - 除了上述情况之外的其他错误。
它的故障排除是我将我的钱放在csv文件的编码上。
来源:http://www.cplusplus.com/reference/string/string/getline/