在MFC中读取.CSV文件内容

时间:2015-05-06 21:27:41

标签: c++ csv mfc

大家好我是C ++ MFC初学者,我希望通过继承CStdioFile类来了解如何在C ++ MFC中读取.CSV文件内容。

该文件包含以下数据:

AAAAAAAAA; BBBBBBB; CCCCCCC; DDDDDDDD; EEEEEEEE; FFFFFFFF;等...

AAAAAAAA直接是没有“”的字符串 例如:test1; test2; ...

并在现实中表示excel中的值。

我想要的是创建一个新的阅读器函数,其中包含两个读入文件的参数(行和列)并提取好的值并将其作为CString返回

目前这是我所拥有的一段代码:

CString ReadData(int rl, int rc)
{
    CString sLine;
    LPCTSTR p = sLine;
    unsigned int i=1;
    unsigned int j=1;
    CString s;

    while(*p!= EOF)
    {
        if(*p==';' && i==rl)
            s.AppendChar(*p);
        if(*p=='\n')
            i++;
        p++;
    }
    return s;
}

这不起作用,尚未完成。

我想要的是帮助知道在文件中执行该操作的方法,如何检测文件的结尾(通常是EOF值?),行尾('\ n'?),我是否必须在一行中存储不同的字符串?当然,也欢迎代码中的一些帮助。

1 个答案:

答案 0 :(得分:2)

一次读取一个字符的文件很慢,你可以读入一个字符串中的较大块。只要文件不是太大,这就可以工作。然后将该字符串标记为不同的行,并将每行标记为不同的字段。

顺便说一下,你要求"分号分隔值"不是csv,所以将','更改为';'

void tokenize(vector<CStringA> &v, const CStringA &source, char token)
{
    for (int start = 0, len = source.GetLength(); start < len;)
    {
        int end = source.Find(token, start);
        if (end < 0) end = len;
        v.push_back(source.Mid(start, end - start));
        start = end + 1;
    }
}

void foo()
{
    CStringA source; //read the whole file in to one string "source"
    const int bufsize = 512 + 1;
    char buf[bufsize];
    CFile file("files.csv", CFile::modeRead|CFile::typeBinary);
    int count;
    while ((count = file.Read(buf, bufsize - 1)) > 0) {
        buf[count] = 0;
        source += buf;
    }

    source.Remove('\r');
    vector<CStringA> lines; //tokenize in to separate lines and store in vector
    tokenize(lines, source, '\n'); 

    for (int row = 0; row < (int)lines.size(); row++) {
        vector<CStringA> fields; //tokenize in to different fields
        tokenize(fields, lines[row], ',');
        for (int column = 0; column < (int)fields.size(); column++)
            TRACE("%s|", fields[column]); //print each field for testing
        TRACE("\n");
    }
}