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倍
【版权声明】转载请注明出处:
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· SQL Server如何跟踪自动统计信息更新?