首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++:给出与原始文件不同的值

c++:给出与原始文件不同的值
EN

Stack Overflow用户
提问于 2016-02-26 11:38:02
回答 2查看 74关注 0票数 1

我正在尝试读取一个包含双格式数字的文件,其矩阵为82503x1200。我正在读取文件,但没有找到指定由being获取的数字的正确大小的方法。为什么要给我那个号码而不是文件号?

代码语言:javascript
运行
复制
float fd;
float ret;
float b;
const size_t NUM_ELEMS = 11;
const size_t NUM_BYTES = NUM_ELEMS * sizeof(float);

fd = open("signal_80k.txt",O_RDONLY);
if(fd < 0){
    perror("open");
    //exit(1);
}

ret = lseek(fd, seekCounter*NUM_BYTES, SEEK_SET);
ret = read(fd, &b, sizeof(float));
cout<<"> " << seekCounter << ": " << b<<endl;
seekCounter++;
close(fd);

它打印:

0: 1.02564e-08 1: 1.08604e-05 2: 0.000174702 3: 6.56482e-07 4: 2.57894e-09

但第一个数值是: 9.402433000000000e 8.459109000000000e 8.947654000000000e+03 9.0216200000000e

这就是在matlab中的样子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-26 12:20:37

在您的评论中,您澄清了该文件包含文本数据,我的回答基于此。现在,让我们看一下文件中的第一个数字:

代码语言:javascript
运行
复制
1.02564e-08

有多少个角色?我数11个字符。然后,在它之后有一个空格,所以这个后面的下一个值将是第一个字符之后的12个字符。

通过临时检查,您的代码集似乎

代码语言:javascript
运行
复制
 const size_t NUM_ELEMS = 11;

为每行值的数目。

然后您的代码集

代码语言:javascript
运行
复制
 const size_t NUM_BYTES = NUM_ELEMS * sizeof(float);

若要计算每行占用的字符数,请执行以下操作。现在,我可能忽略了这些常量的实际意义,但无论如何,文件中有一个目标值,并且您试图直接寻找它,这是底线。所以,为了这个答案,我会解释一下,但答案还是一样的,无论如何。

为你做个测验。什么是sizeof(float)

答:在大多数实现中,这是4个字节(因此,我将假设这是向前推进的)。因此,您计算出每行将有44个字符,并使用该字符试图在文件中寻找合适的行。至少我是这么分析你的代码的。

当然,问题是,假设每个值用科学表示法表示,每行11个值,每个值占用12个字符(包括尾随空格或换行符),那么每一行实际上将占用11 * 12或132个字符,而不是44个字符。如果您使用的是对新行使用\r\n的实现O/S,则再添加一个字符。

所以,你需要做一些调整。即使在那之后,整个卡片屋都依赖于文件中的每个值,总是用科学的符号来表示,精度也是一样的。

这是一个你无法真正做出的假设。此外,这并不是唯一的问题。

第二个问题是,您试图将文件的内容直接读取到float数据类型中。是的,每个float数据类型将是四个字符,因为这就是用二进制表示float值所需的字节数。这里的问题是文件不包含原始二进制数据,而是包含文本数据。

总之,我认为这里没有太多的选择,而是从开始到结束读取文件,而不是试图寻找正确的位置,因为您无法保证文件中的每个值将占用相同数量的字符;然后将文件作为文本读取,并使用operator>>将其内容转换为float值。

票数 2
EN

Stack Overflow用户

发布于 2016-02-26 14:01:43

如果文件是二进制文件,那么would将是合适的方法吗?

我改变了这方面的做法:

代码语言:javascript
运行
复制
ifstream inFile("signal_80k.txt");
string line;
int count = 0 ;
if(!inFile.is_open())
{
    cout<<"\n Cannot open the signal_80k.txt file"<<"\n";
}
else
{
    cout<<"loading all data... "<<"\n";
    while(getline( inFile , line) ){
        vector< string > numbers = ci::split( line, " ", false );
        for(int i = 0; i <numbers.size(); i++){
            try{
                float thisNumber =  std::stof(numbers.at(i));
                cout<<"numbers at: " << " = "<< thisNumber <<"\n";
            }
            catch (...){
            }
        }
        count++;
        cout<<"done: "<<count<<"\n";
    }
    cout<<"all data ready!"<<"\n";
    inFile.close();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35650719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档