自定函數實作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檔案的相關實作方法。