c/c++不確定個数の整数を1行読み込む

1952 ワード

ファイルがあると仮定します.ファイルの各行にはn個の整数が含まれています.整数の間はスペースで区切られています.ファイルにはm行がありますが、n,mは事前に知りません.ファイルから1行の整数を読み込むたびに配列に配置する方法.
2つのステップに分けることができます:1、まずファイルから1行の文字列を読み込み、2、それからこの行の文字列から整数を解析します.
 
最初のステップでは、c、c++の2つのスタイルの方法があります.
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の効率がほぼ同じであることを示す時間の差は大きくない.
 
 
2番目のステップでは、1行の文字列から整数を解析します.以下は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;
}

 
この3つの方法は時間がかかり,方法2と方法2はほぼ同じ(方法3の時間はやや多い),方法1の差は方法2の10倍である.
 
【著作権声明】転載は出典を明記してください: