将分离的数据读入数组结构c ++

时间:2014-09-02 11:28:21

标签: c++ getline

我正在尝试读取以';'分隔的数据进入一个结构数组,所以我以后可以过滤它们。 示例数据:

1.1 ; name1; 11-07-2014; 14:30
1.2 ; name2; 11-07-2017; 15:10

我不知道这个.txt文件中会有多少条目。此外,我需要添加一个可用性来选择用户想要工作的文件(这是有效的)我是c ++的新手,所以我会感激任何提示。

到目前为止,我已创建了这个:

typedef struct{
    char numb[21];
    char names[100];
    char date[11];
    char time[6];
}vec;

vec *logs[200];

void_fastcall TForm1::Button1Click(TObject *Sender)
{
    OPENFILENAME ofn;
    char fname[MAX_PATH] ="";
    ZeroMemory( & ofn, sizeof( ofn ) );
    ofn.lStructSize = sizeof( ofn );
    ofn.lpstrFilter = "Text files (*.txt)\0*.txt\0All files\0*.*\0";
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFile = fname;
    ofn.lpstrDefExt = "txt";
    ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

    string line;

    if( GetOpenFileName( & ofn ) )
    {
        for(int i=0; i<200; i++){
            getline(fname, logs[i].numb, ';');
            getline(fname, logs[i].names, ';');
            getline(fname, logs[i].date, ';');
            getline(fname, logs[i].time, ';');   
        }
    }
}

我收到了这个错误 E2285找不到匹配的'getline&lt; _CharT,_Traits,_Alloc&gt;(char *,undefined,char)'

1 个答案:

答案 0 :(得分:0)

我对你的代码感到困惑。 fname是一个LPTSTR,所以是一个字符串。这应该如何与getline一起使用?

我知道的唯一获取行函数是:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

或:

std::istream& std::getline(std::istream& is, std::string& str, char delim);
std::istream& std::getline(std::istream& is, std::string& str);

由于您使用GetOpenFileName,因此您在Windows上,这意味着您只能使用更晚的版本。无论如何,你需要实际打开一个文件进行阅读。

怎么样:

struct vec{
    std::string numb;
    std::string names;
    std::string date;
    std::string time;
};

std::vector<vec> logs;

size_t i = 0;
std::ifstream in(fname);
while (in.good() && i < 200)
{
    std::string line;
    getline(in, line);

    std::vector<std::string> bits = explode(line, ";");
    assert(bits.size() == 4);
    vec v = {bits[0], bits[1], bits[2], bits[3]};
    logs.push_back(v);        
    i++;
}

这是我方便的爆炸功能:

std::vector<std::string> explode(const std::string& str, const std::string& delimiter)
{
    std::vector<std::string> gibs;
    size_t start = 0;
    size_t end = 0;

    while ((start != std::string::npos) && (start < str.size()))
    {
        end = str.find(delimiter, start);

        std::string gib;
        if (end == std::string::npos)
        {
            gib = str.substr(start);
            start = std::string::npos;
        }
        else
        {
            gib = str.substr(start, end - start);
            start = end + delimiter.size();
        }
        gibs.push_back(gib);
    }

    return gibs;
}

如果你想编写C或C ++,最后下定决心。混合两者绝不是一个好主意。