故障排除读取CSV文件代码

时间:2014-08-06 14:12:37

标签: c++ csv

我一直试图在没有运气的情况下麻烦拍摄这段代码几天。我正在尝试读取看起来像这样的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;并且似​​乎没有继续代码..只是停止它。

2 个答案:

答案 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/