2015-05-06 241 views
0

大家好,我是一名C++ MFC初學者,我想了解如何通過繼承CStdioFile類來讀取C++ MFC中的.CSV文件內容。在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'?) ,我必須將不同的字符串存儲在一行中嗎?當然也歡迎代碼中的一些幫助。

+0

搜索StackOverflow上的「C++讀取文件的CSV」。這已經被問過太多次了。 –

+0

我推薦學習純粹的C++,然後學習MS obscurities,比如'CString'和'String ^'。使用普通的C++,我推薦'std :: getline'使用';'作爲分隔符。 –

回答

1

一次只讀取一個字符的文件很慢,您可以在較大的塊中讀入一個字符串。只要文件不太大,這就可以工作。然後將該字符串標記爲不同的行,並將每行標記爲不同的字段。

順便問一下,你所要求的「分號分隔值」不CSV,所以更改','到​​3210

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"); 
    } 
} 
+0

它可能被稱爲「逗號分隔值文件」,但實際上人們使用逗號,分號,標籤......只要他處理所有內容正確,使用分號應該不成問題。 – Blacktempel