需要理论帮助阅读文件和东西

时间:2011-09-15 18:15:14

标签: c++ io

我想请求理论部分的一些帮助,所以研究这些齿轮,来吧

我想将一个文件加载到我的程序中,看起来像这样:

0,10,10#0,100,40...

好的,我现在要做的是取出每个以逗号分隔的数字并通过我的功能发送

  

void func(int,float,float);

主题标签意味着它是一个新的块,因此它将像func(0,10,10)一样发送,之后它将发送func(0,100,40)等等。

我正在考虑检查每个字符,直到我遇到','然后把它放在一个向量中,并继续直到'#'被满足。然后它会解雇我的函数(如func(v [0],v [1],v [2]),然后一遍又一遍地做同样的事情,直到EOF!

这是一个好方法吗?有更好的想法吗?这些数字也可能在以后变得非常大,所以我不知道我需要多少内存(因此向量)。或者我应该使用3个临时值和浮点数然后启动该函数并重新开始!

3 个答案:

答案 0 :(得分:1)

使用char建立char并使用你建议的状态机是最快的方法 但最简单的方法是先按#拆分,然后按,拆分每个结果字符串。
您可以使用boost库来执行字符串split

答案 1 :(得分:1)

#include <fstream>
#include <ostream>
#include <istream>
#include <stdexcept>

void func( std::vector<float> &numbers )
{}

int main() {
    std::ifstream myfile("myfile.txt");

    float number;
    char seperator;
    std::vector<float> numbers;
    while( myfile >> number) { //read number
        numbers.push_back(number); //and remember it
        if (!(myfile >> seperator) || seperator == "#") { //if # or EOF or error
            func(numbers); //run function
            numbers.clear();  //and start over
        }
    } //only gets here at EOF or malformed file
    return 0;
}

非常简单,快速,简单。

答案 2 :(得分:0)

如果您确定该文件以一组三个

中的第一个int开头
ifstream fin("foo.csv");
string str;
stringstream s_str;
while(!fin.eof())
{
    int a;
    float b,c;
    getline(fin,str,',');
    s_str.str(str);
    s_str >> a;
    getline(fin,str,',');
    s_str.str(str);
    s_str >> b;
    getline(fin,str,'#');
    s_str.str(str);
    s_str >> c;
}

应该有效。 (我没有编译它所以可能有拼写错误等)