假設有一個文件,文件的每一行包括n個整數,整數之間以一個空格隔開,文件總共有m行,但是事先不知道n,m。如何每次從文件中讀取一行整數放到一個數組中。
可以分為兩步:1、首先從文件中讀入一行字符串,2、然后從這一行字符串中解析出整數。
對於第一步,我們可以有c、c++兩種風格的做法
c風格:
FILE *fp = fopen("input.txt", "r"); char buf[10000]; while(fgets(buf, 10000, fp)) { //從buf解析出整數 }
c++風格:
ifstream infile("input.txt");
string s; while(getline(infile, s)) { //從s中解析出整數 }
經過測試如果不考慮解析整數的時間,這兩種方法耗時相差不大,說明getline和fgets效率基本相同。
對於第二步,從一行字符串中解析出整數,以下提供3中方法, 為了簡單,我們只是返回從字符串中解析出的整數個數,並沒有把他們存入數組
方法1:利用字符串流istringstream
int getInt(string &s) { istringstream iss(s); int num, res = 0; while(iss >> num) res++; return res; }
方法2:利用strstr函數和atoi函數
int getInt(const char *buf) { const char *loc = buf; int res = 0; atoi(buf); loc = strstr(buf," "); while(loc != NULL) { atoi(loc+1); res++; loc = strstr(loc+1, " "); } return res; }
方法3:利用strtok函數(該函數用法可參考關於函數strtok和strtok_r的使用要點和實現原理(一))和atoi函數
int getInt(char *buf) { char *p = strtok(buf, " "); int res = 0; while(p) { atoi(p); res++; p = strtok(NULL, " "); } return res; }
這三種方法的耗時,方法2和方法2基本相同(方法3的時間略多),方法1差不多是方法2的10倍
【版權聲明】轉載請注明出處: