c/c++不確定個数の整数を1行読み込む
1952 ワード
ファイルがあると仮定します.ファイルの各行にはn個の整数が含まれています.整数の間はスペースで区切られています.ファイルにはm行がありますが、n,mは事前に知りません.ファイルから1行の整数を読み込むたびに配列に配置する方法.
2つのステップに分けることができます:1、まずファイルから1行の文字列を読み込み、2、それからこの行の文字列から整数を解析します.
最初のステップでは、c、c++の2つのスタイルの方法があります.
cスタイル:
c++スタイル:
整数を解析する時間を考慮しないと,getlineとfgetsの効率がほぼ同じであることを示す時間の差は大きくない.
2番目のステップでは、1行の文字列から整数を解析します.以下は3つの方法を提供します.簡単にするために、文字列から解析した整数の個数を返すだけで、配列に格納されていません.
方法1:文字ストリームistringstreamを利用する
方法2:strstr関数とatoi関数を利用する
方法3:strtok関数(関数strtokとstrtokについてrの使用要点と実現原理(一)参照)とatoi関数を用いる
この3つの方法は時間がかかり,方法2と方法2はほぼ同じ(方法3の時間はやや多い),方法1の差は方法2の10倍である.
【著作権声明】転載は出典を明記してください:
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倍である.
【著作権声明】転載は出典を明記してください: