c/c++ 读入一行不确定个数的整数

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

假设有一个文件,文件的每一行包括n个整数,整数之间以一个空格隔开,文件总共有m行,但是事先不知道n,m。如何每次从文件中读取一行整数放到一个数组中。

可以分为两步:1、首先从文件中读入一行字符串,2、然后从这一行字符串中解析出整数。

 

对于第一步,我们可以有c、c++两种风格的做法

c风格:

1
2
3
4
5
6
FILE  *fp = fopen ( "input.txt" , "r" );
     char  buf[10000];
     while ( fgets (buf, 10000, fp))
     {
         //从buf解析出整数
     }

c++风格:

1
ifstream infile( "input.txt" );
1
2
3
4
5
string s;
     while (getline(infile, s))
     {
         //从s中解析出整数
     }

 

经过测试如果不考虑解析整数的时间,这两种方法耗时相差不大,说明getline和fgets效率基本相同。

 

 

对于第二步,从一行字符串中解析出整数,以下提供3中方法, 为了简单,我们只是返回从字符串中解析出的整数个数,并没有把他们存入数组

方法1:利用字符串流istringstream

1
2
3
4
5
6
7
8
int  getInt(string &s)
{
     istringstream iss(s);
     int  num, res = 0;
     while (iss >> num)
         res++;
     return  res;
}

 

方法2:利用strstr函数和atoi函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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函数

1
2
3
4
5
6
7
8
9
10
11
12
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倍






本文转自tenos博客园博客,原文链接:http://www.cnblogs.com/TenosDoIt/p/3724234.html,如需转载请自行联系原作者

目录
相关文章
|
4月前
|
算法 测试技术 C#
【数位dp】【C++算法】600. 不含连续1的非负整数
【数位dp】【C++算法】600. 不含连续1的非负整数
|
4月前
|
C语言 C++
【C++之数组与指针1】随机输入整数存入数组并用指针遍历
【C++之数组与指针1】随机输入整数存入数组并用指针遍历
|
4月前
|
C++
c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)
c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)
73 0
|
1月前
|
C++
C++产生N以内的随机整数
C++产生N以内的随机整数
|
4月前
|
存储 C++
C/C++中的整数除法运算与汇编指令DIV和IDIV
C/C++中的整数除法运算与汇编指令DIV和IDIV
72 1
|
4月前
|
C++
41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少
41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少
39 0
|
4月前
|
存储 安全 程序员
C/C++中的整数乘法运算与汇编指令MUL和IMUL
C/C++中的整数乘法运算与汇编指令MUL和IMUL
60 0
|
4月前
|
算法 测试技术 C++
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
|
4月前
|
算法 测试技术 C++
【数位dp】【C++算法】600. 不含连续1的非负整数
【数位dp】【C++算法】600. 不含连续1的非负整数
|
4月前
|
编解码 算法 程序员
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(三)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
59 0