假設有一個文件,文件的每一行包括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倍
【版權聲明】轉載請注明出處:
