C++ 用fstream读取双精度数据的时候出错

ChaosStudyC 2015-01-26 12:34:38


float b;
fstream fp;
fp.open("data.txt");
while(!fp.eof())
fp>>b;
cout<<b<<endl;

其中data.txt的数据是这样的

然后运行的时候这样- -

这是个什么鬼情况,求解,急

...全文
333 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChaosStudyC 2015-01-27
  • 打赏
  • 举报
回复
引用 13 楼 CharlesSimonyi 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] 乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout! 使用scanf、printf。
赵老师,再次被你的赚分神器折服[/quote] 主要是赵老师的说法给我提供了点灵感才解决问题的
ChaosStudyC 2015-01-27
  • 打赏
  • 举报
回复
引用 12 楼 coding_hello 的回复:
b没读到值,用MS的vs系列编译器,debug版本的时候,float被初始化成0xccccccc, 按浮点解释就是-1.07374e+008 所以楼主的问题就是b根本没读到东西。文件路径不对吧。别写data.txt, 写绝对路径试试,比如 把data.txt放在D盘根目录下,然后路径写 "D:\\data.txt"
不关事,路径没问题,因为我data.txt文件是从某excel文件里面直接导出的,可能是excel的编码原因导致读入的数据识别不了被认为是空值,现在问题已经解决了,只要把文件里的数据复制出来然后黏贴到另外一个txt文件里就好了。原导出的txt文件大小刚好是复制后的txt文件的两倍- -
赵4老师 2015-01-27
  • 打赏
  • 举报
回复
引用 15 楼 ChaosStudyC 的回复:
[quote=引用 13 楼 CharlesSimonyi 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout! 使用scanf、printf。
赵老师,再次被你的赚分神器折服[/quote] 主要是赵老师的说法给我提供了点灵感才解决问题的[/quote] http://bbs.csdn.net/topics/390471779
encoderlee 版主 2015-01-27
  • 打赏
  • 举报
回复
float b; fp >> b; 使用C++流格式化输入到float等变量时, 每调用一次fp >> b;最好都检查一下流状态。 fp.rdstate()或fp.good()确保之前的转换成功, 再进行下一步动作。
encoderlee 版主 2015-01-26
  • 打赏
  • 举报
回复



#include <fstream>
#include <string>
#include <iostream>
using namespace std;

void main()
{
float b;
fstream fp;
fp.open("data.txt");
if (!fp.good())
{
cout << "文件打开失败" << endl;
return;
}
while(!fp.eof())
{
fp >> b;
cout << b << endl;
}
}


打开文件后检查一下打开成功了没有,估计你的文件打开失败了。
encoderlee 版主 2015-01-26
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout! 使用scanf、printf。
赵老师,再次被你的赚分神器折服
野男孩 2015-01-26
  • 打赏
  • 举报
回复
b没读到值,用MS的vs系列编译器,debug版本的时候,float被初始化成0xccccccc, 按浮点解释就是-1.07374e+008 所以楼主的问题就是b根本没读到东西。文件路径不对吧。别写data.txt, 写绝对路径试试,比如 把data.txt放在D盘根目录下,然后路径写 "D:\\data.txt"
ChaosStudyC 2015-01-26
  • 打赏
  • 举报
回复
发现问题了,由于txt文件的数据是我从excel文件里面直接导出的,里面可能存在有某些隐藏数据在里面干扰了。。把数据复制到另一个txt文件里面就正常了擦- -
ChaosStudyC 2015-01-26
  • 打赏
  • 举报
回复
引用 5 楼 CharlesSimonyi 的回复:

#include <fstream>
#include <string>
#include <iostream>
using namespace std;

void main()
{
	float b;
	fstream fp;
	fp.open("data.txt");
	if (!fp.good())
	{
		cout << "文件打开失败" << endl;
		return;
	}
	while(!fp.eof())
	{
		fp >> b;
		cout << b << endl;
	}
}
打开文件后检查一下打开成功了没有,估计你的文件打开失败了。
文件打开成功了,然后还是死循环的输出那种奇葩的数据,究竟是什么情况!代码我是直接复制你的过去的
ChaosStudyC 2015-01-26
  • 打赏
  • 举报
回复
while上面的请不要在意细节好么。原程序跟这个差远了,问题不是出在这里
michael2988 2015-01-26
  • 打赏
  • 举报
回复
你的初衷是不是

while(!fp.eof())
{
    fp>>b;
    cout<<b<<endl
}
幻夢之葉 2015-01-26
  • 打赏
  • 举报
回复

while(!fp.eof())
	fp>>b;

// End while
cout<<b<<endl;
你只有一次输出怎么可能输出那么多数据?! 你是不是代码修改后没有编译?!
fly_dragon_fly 2015-01-26
  • 打赏
  • 举报
回复
不是这个代码,这代码只能输出一次
赵4老师 2015-01-26
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
char s[80];
double d;
char c;
int main() {
    while (1) {
        printf("Input a double:");fflush(stdout);
        rewind(stdin);
        fgets(s,80,stdin);
        if (strlen(s)>20) {
            printf("Input too long(>20)!\n");
            continue;
        }
        if (2==sscanf(s,"%lf%c",&d,&c)) {
            if ('\n'==c) {
                printf("%lg is a double.\n",d);
                break;
            }
        }
        if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;
        printf("\"%s\" is NOT a double!\n",s);
    }
    return 0;
}
赵4老师 2015-01-26
  • 打赏
  • 举报
回复
乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout! 使用scanf、printf。
赵4老师 2015-01-26
  • 打赏
  • 举报
回复
double才是双精度。
ri_aje 2015-01-26
  • 打赏
  • 举报
回复
没看出啥大毛病,判断条件直接用 fp 试试呢。

64,662

社区成员

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

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