C++ 读取文本文件问题

yanasdf789 2013-07-31 04:57:48
我想实现从文本文件中随机读取 几行的数据,
文本数据
882.840,55.244,7.261,68,69,64,-6.330
882.989,55.311,7.276,92,86,74,-4.290
882.877,55.349,7.266,79,77,65,-7.000
882.922,55.279,7.259,84,82,70,-15.130
882.884,55.314,7.264,82,80,68,-8.800
代码如下

FILE *file=fopen("D:\\tt.txt","r");
char str[100];
fgets(str,99,file);
fseek(file,0,0);
int lenth=strlen(str)*3; //获取每行的字节数*行数
fseek(file,lenth,0); //指针偏移量
Struct_PT temp1; //一个结构体
fscanf(file,"%f,%f,%f,%d,%d,%d,%f\n",&temp1.x,&temp1.y,&temp1.z,&temp1.r,&temp1.g,&temp1.b,&temp1.i);
float xx=temp1.x;
float yy=temp1.y;
float zz=temp1.z;
int rr=temp1.r;
int gg=temp1.g;
int bb=temp1.b;
float ii=temp1.i;

我读取第 一行 ,第二行 即 lenth=strlen(str)*2 是正确的
如果读取第三行开始lenth=strlen(str)*3 就错误了读不到数据
奇怪的问题?怎么结果啊
...全文
174 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-08-04
  • 打赏
  • 举报
回复
如果,只是为了随机读取,不怕时间损失,可以整个文件读一遍,或者全部映射到内存。 记录每一行的位置。然后就可以随时随机读取了。 一般 txt 都不是很大的,这样做应该没有问题。
赵4老师 2013-08-01
  • 打赏
  • 举报
回复
引用 5 楼 mujiok2003 的回复:
[quote=引用 2 楼 yanasdf789 的回复:] 我发现 原因是第四行的字符串长度 与其余的不一样,我无法保证每行的长度一样,所以不能这样 定位 int lenth=strlen(str)*行数; 我想做的是 从任意一行开始读取?求怎么做呢
只有内存支持随机读写。若要从第n行开始读,使用fgets读取前n-1行并丢弃既可[/quote] 正解!
mujiok2003 2013-08-01
  • 打赏
  • 举报
回复
引用 2 楼 yanasdf789 的回复:
我发现 原因是第四行的字符串长度 与其余的不一样,我无法保证每行的长度一样,所以不能这样 定位 int lenth=strlen(str)*行数; 我想做的是 从任意一行开始读取?求怎么做呢
只有内存支持随机读写。若要从第n行开始读,使用fgets读取前n-1行并丢弃既可
图灵狗 2013-08-01
  • 打赏
  • 举报
回复
不需要根据长度去作fseek,只要循环的fscanf结构体就可以了,直到它的返回值是EOF。
引用 楼主 yanasdf789 的回复:
我想实现从文本文件中随机读取 几行的数据, 文本数据 882.840,55.244,7.261,68,69,64,-6.330 882.989,55.311,7.276,92,86,74,-4.290 882.877,55.349,7.266,79,77,65,-7.000 882.922,55.279,7.259,84,82,70,-15.130 882.884,55.314,7.264,82,80,68,-8.800 代码如下

	FILE *file=fopen("D:\\tt.txt","r");
	char str[100];
	fgets(str,99,file);
	fseek(file,0,0);
	int lenth=strlen(str)*3; //获取每行的字节数*行数
	fseek(file,lenth,0); //指针偏移量
	Struct_PT temp1; //一个结构体
    fscanf(file,"%f,%f,%f,%d,%d,%d,%f\n",&temp1.x,&temp1.y,&temp1.z,&temp1.r,&temp1.g,&temp1.b,&temp1.i);
	float xx=temp1.x;
	float yy=temp1.y;
	float zz=temp1.z;
	int rr=temp1.r;
	int gg=temp1.g;
	int bb=temp1.b;
	float ii=temp1.i;
我读取第 一行 ,第二行 即 lenth=strlen(str)*2 是正确的 如果读取第三行开始lenth=strlen(str)*3 就错误了读不到数据 奇怪的问题?怎么结果啊
max_min_ 2013-08-01
  • 打赏
  • 举报
回复

每行定长的写入文件呗!
yanasdf789 2013-08-01
  • 打赏
  • 举报
回复
我发现 原因是第四行的字符串长度 与其余的不一样,我无法保证每行的长度一样,所以不能这样 定位 int lenth=strlen(str)*行数; 我想做的是 从任意一行开始读取?求怎么做呢
赵4老师 2013-07-31
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧