• 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倍

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

  • 相关阅读:
    c#redis使用
    不安全的HTTP方法(渗透实验)
    arguments.callee弃用与webuploader
    多线程系列1:经典卖票
    终于确定了系统lsass.exe占用cpu的根本原因了,速度来看一看!![转载]
    edit响应键盘的“咚咚”声音去掉
    delphi资源文件制作及使用详解
    MySQL server has gone away错误的解决办法
    MySQL server has gone away的解决方法
    MySQL
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3724234.html
Copyright © 2020-2023  润新知