天天看點

自定函數實作C++讀取CSV檔案

自定函數實作C++讀取CSV檔案

http://developer.51cto.com  2010-02-01 13:26  佚名  部落格園  我要評論(0)

C++讀取CSV檔案需要一個合适的函數來進行具體的操作。如果沒有現成的函數供我們使用,我們可以自己編寫一個來友善我們的使用。

C++是一個應用方式非常靈活的程式設計語言。我們可以通過自己的需求,自己編寫一個适合自己開發的函數來實作一些特定的功能。比如今天為大家介紹的就是自定義函數來實作C++讀取CSV檔案這一功能。

C++靜态構造函數相關概念解析

C++ Traits應用技巧分享

C++虛函數示例解讀

C++函數指針與C#委托之間有何聯系

C++ explicit關鍵字應用于構造函數

今天恰好做一個東西需要一個C++讀取CSV檔案的函數。

沒有找到現成的函數,是以就自己寫了一個。

目的就是實作C++讀取CSV檔案,每一行讀到一個數組中。

有點生疏了,字元串處理函數都不知道有什麼現成的,是以也寫了兩個輔助的字元串處理函數。

第一個函數:計算一個字元串中的某個子串的個數

int strstr_cnt(const char *string, const char

*substring) { 

int i,j,k,count = 0; 

for (i = 0; string[i]; i++){ 

for (j = i, k = 0; (string[j] ==

substring[k] && (j < strlen(string))); j++,k++) { 

if (! substring[k + 1]) { 

count++; 

return count; 

}

第二個函數:計算一個子串在字元串中的位置

int substring_index(const char *s1,const char *s2, int pos){ 

int i,j,k; 

for( i = pos ; s1[i] ; i++ ) { 

for( j = i, k = 0 ; s1[j] == s2[k]; j++,k++ ){ 

if (! s2[k + 1]) { 

return i; 

return -1; 

}

第三個函數:讀取已經打開的一個CSV檔案的一行,将這一行處理到一個數組中。

char *fgetcsvline(vector<string> &csv_databuf, FILE *fhead) { 

char *ret_stat; 

char data_buf[1024]; 

string stringbuf; 

ret_stat = fgets( data_buf, 1024, fhead ); 

if (ret_stat != NULL) { 

int len = strstr_cnt(data_buf,"/",/""); 

if (len > 0){ 

int pos = substring_index(data_buf,"/",/"",0); 

int startpos = 1; 

string csv_buf; 

while (pos > 0) { 

stringbuf = (string)data_buf; 

csv_buf = stringbuf.substr(startpos,pos - startpos); 

csv_databuf.push_back(csv_buf); 

startpos = pos + 3; 

pos = substring_index(data_buf,"/",/"",pos + 2); 

if ((substring_index(data_buf,"/n",0)) > 0){ 

csv_buf = stringbuf.substr(startpos, stringbuf.length()

- startpos - 2); 

} else { 

csv_buf = stringbuf.substr(startpos, stringbuf.length()

- startpos - 1); 

csv_databuf.push_back(csv_buf); 

return ret_stat;  

}

這個函數使用上面的兩個函數來處理字元串。

另外這個函數用來處理的CSV檔案是帶雙引号格式的:

"sss","ddd","444" 

"ttt","www","ooo" 

"sss","qqq","000"

使用方法如下:

int main(int argc, char* argv[]) { 

FILE *fp_head; 

string csvFileName = "test.csv"; 

char *ret_stat; 

vector<string> csv_data; 

fp_head = fopen( csvFileName, "rt" ); 

ret_stat = fgetcsvline(csv_data, fp_head); 

while (ret_stat != NULL) { 

//get csv data use csv_data[n] 

ret_stat = fgetcsvline(csv_data, fp_head); 

return 0; 

}

以上代碼可能需要稍加調試。也可稍加改動用來讀取其它格式的csv檔案。

以上就是C++讀取CSV檔案的相關實作方法。