c/c++ 读入一行不确定个数的整数
2014-05-12 21:19
1011 查看
假设有一个文件,文件的每一行包括n个整数,整数之间以一个空格隔开,文件总共有m行,但是事先不知道n,m。如何每次从文件中读取一行整数放到一个数组中。
可以分为两步:1、首先从文件中读入一行字符串,2、然后从这一行字符串中解析出整数。
对于第一步,我们可以有c、c++两种风格的做法
c风格:
c++风格:
经过测试如果不考虑解析整数的时间,这两种方法耗时相差不大,说明getline和fgets效率基本相同。
对于第二步,从一行字符串中解析出整数,以下提供3中方法, 为了简单,我们只是返回从字符串中解析出的整数个数,并没有把他们存入数组
方法1:利用字符串流istringstream
方法2:利用strstr函数和atoi函数
方法3:利用strtok函数(该函数用法可参考关于函数strtok和strtok_r的使用要点和实现原理(一))和atoi函数
这三种方法的耗时,方法2和方法2基本相同(方法3的时间略多),方法1差不多是方法2的10倍
【版权声明】转载请注明出处:
可以分为两步: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倍
【版权声明】转载请注明出处:
相关文章推荐
- 【图】单源最短路径bellman-ford和SPFA
- dev -c++ 快捷键
- C/C++的杂七杂八
- 【图】单源最短路径dijkstra
- 【图】最小生成树kruskal
- C++ 2
- C++:#pragma pack(1)
- C++内存分配——堆栈祥解
- 堆栈实现(C++)
- C++类中的static数据成员,static成员函数
- C++ 11 新特性之 lambda表达式
- C/C++基础知识总结——数据的共享与保护
- 单链表的实现(C++版)
- 每天一个C++小程序(二十)--简单的飘雪程序
- C语言 绘制漂亮的六叶图案
- c++一个简单的线程
- WM_CTLCOLOR和OnCtlColor消息的用法
- C++ GUI QT 第4版 之线程 -------总结
- C语言 getchar putchar gets puts sscanf sprintf strlen strcpy strcat strcmp函数列子
- C++ GUI QT 第4版 之线程(三) 与主线程通讯