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

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

【版权声明】转载请注明出处:

时间: 2024-11-05 12:55:50

c/c++ 读入一行不确定个数的整数的相关文章

SQL判断一个数是整数还是小数

DECLARE @number1 AS numeric(10,2),@number2 AS numeric(10,2) SELECT @number1=10.00,@number2=10.2 SELECT CASE WHEN CAST(@number1 AS INT)[email protected] THEN '整数' ELSE '小数' END, CASE WHEN CAST(@number2 AS INT)[email protected] THEN '整数' ELSE '小数' END 

sql中,如何获取一个数的整数部分和余数部分

我们测试一下,我要得到的结果是多少周(整数),多少天(余数) 1.获取指定日期到当前日期之间的天数 首先用DATEDIFF() 函数获取指定日期到当前日期的天数 --获取指定日期到当前日期的天数 select DATEDIFF(DD,'2017-08-15',GETDATE()) 2.得到返回的结果(当前是45天) 3.计算多少周多少天 --获取周数 select 45/7 --获取剩下的天数 select 45%7 --组合成多少周多少天 select CAST( (CAST((45/7) a

自己实现一个数的整数次方 11

注意输入的判断,多写几个if语句判断是否满足输入数据的条件 ? ? 另外exp为负的时候,输入的base变为1.0/base而不是1/base ? ? 所以返回值要设置为double,base也要设为double ? ? 另外要自己定义equal,而不能用==,要去判断两个数的差的绝对值是否在一定范围内 ? ? package myPower11; ? ? public class MyPower11 { static boolean equal(double num1,double num2)

如何判断一个数是否是整数

首先不能习惯性的写int n = XXX,然后再来判断,肯定是整数啊. 下面三种方法都可以,fmod是float类型的求余,ceil是求大于一个数的整数,比如3.5就是4

lintcode 中等题:4 Sum 四个数之和

题目 四数之和 给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d). 样例 例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=0. 满足要求的四元组集合为: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2) 注意 四元组(a, b, c, d)中,需要满足a <= b <= c <= d 答案中不可以包含重复的四元组. 解题 怎么感觉下面程序已经没法修改了但是在

比较两个整数的大小

比较两个整数的大小 说明:使用if条件从句比较两个整数的大小.使用传参方法时,需要对传参个数及传入的参数是否是整数进行判断. 思路 第一,先判断输入的是两个数,对输入个数进行判断: 第二,再判断输入的两个数是整数: 第三,最后比较两个数的大小. 脚本1如下 #!/bin/bash #write by wtf #date:2017-7-5 a=$1 b=$2 if [ $# -ne 2 ];then echo "Please enter two Numbers!" exit 1 fi e

判断有序整型数组中是否存在两数,相加之和等于给定的任意整数

前几天参加C++的一个面试,面试官问到这样一个问题,当时给出的第一答案是1. 遍历数组中的元素,两数相加与给定的整数进行比较,此种方法在数组个数和整数个数较小时可用. 两数之和等于任意整数,肯定有一个数小于等于任意整数的1/2,另一个数大于等于任意整数的1/2,那么只需要判断整数的一半,由于数组是排序的,可通过二分查找的方式 直接遍历数组中小于等于任意整数一半的元素,通过二分查找的方式,在数组中的有序元素不连续时,相比方法2更节省许多运算

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成"去重"与"排序"的工作. Input Param n               输入随机数的个数 inputArray      n个随机整数组成的数组 Return Value

统计二进制数中的1的个数(0277)

程序设计C 实验二 题目五 统计二进制数中的1的个数(0277) 整数在计算机中使用二进制的形式表示,如整数7用二进制表示为:111,其中1的个数为3. 输入一个整数:7 输出该整数用二进制表示时,其中1的个数:3 代码: #include<iostream> #include<math.h> using namespace std; int max(int a, int b) { return a > b ? a : b; } int min(int a, int b) {