c/c++ 讀入一行不確定個數的整數


假設有一個文件,文件的每一行包括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倍

 

【版權聲明】轉載請注明出處:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM