C++ c++;:lseek提供与原始文件比较的不同值

C++ c++;:lseek提供与原始文件比较的不同值,c++,matlab,C++,Matlab,我试图读取一个文件,该文件包含82503x1200矩阵中的双格式数字。我正在读取该文件,但没有找到指定lseek使用的数字的正确大小的方法。为什么给我那个号码而不是文件号码 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)

我试图读取一个文件,该文件包含82503x1200矩阵中的双格式数字。我正在读取该文件,但没有找到指定lseek使用的数字的正确大小的方法。为什么给我那个号码而不是文件号码

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);
float-fd;
浮网;
浮球b;
const size\u t NUM\u ELEMS=11;
常量大小NUM字节=NUM元素*sizeof(浮点);
fd=打开(“信号_80k.txt”,仅限O_rdon);
如果(fd<0){
佩罗(“公开”);
//出口(1);
}
ret=lseek(fd,seekCounter*NUM_字节,SEEK_集);
ret=读取(fd,&b,sizeof(浮动));

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

1.02564e-08
有多少个字符?我数了11个字符。然后,它后面有一个空格,所以这个后面的下一个值将是第一个后面的12个字符

通过不经意的检查,您的代码集

 const size_t NUM_ELEMS = 11;
 const size_t NUM_BYTES = NUM_ELEMS * sizeof(float);
为每行的值数

然后你的代码集

 const size_t NUM_ELEMS = 11;
 const size_t NUM_BYTES = NUM_ELEMS * sizeof(float);
计算每行占用的字符数。现在,我可能忽略了这些常量的实际含义,但在任何情况下,文件中都有一个目标值,并且您正试图直接查找它,这是底线。所以,为了这个答案,我会用这个解释,但无论如何,答案都是一样的

你的突击测验。什么是
sizeof(float)

答:在大多数实现中,它是4个字节(所以我假设继续)。因此,您计算每行有44个字符,并使用它来尝试查找文件中的适当行。至少,我是这样解析你的代码的

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

所以,你需要在这里做一些调整。甚至在那之后,这整个纸牌屋都依赖于文件中的每一个值,总是用科学符号表示,精度相同

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

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


总之,我在这里看不到太多的选择,只能从头到尾阅读文件,而不是试图寻找正确的位置,因为不能保证文件中的每个值都会占用相同数量的字符;然后以文本形式读取文件,并使用
操作符>
将其内容转换为
浮点值。

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

我改变了这种做法:

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();
}
ifstream-infle(“signal_80k.txt”);
弦线;
整数计数=0;
如果(!infle.is_open())
{

couty您的代码看起来像是在读取二进制数据,但您的文件扩展名是txt,这表明它是文本数据。嗨,丹尼尔,是的,它是文本数据…这意味着lseek不是正确的方法?您的文本文件是什么样子的?只是用一个空格分隔的浮点数,而不是CSV。该说明不足以使用
lseek
。有多少个字符每个数字的字符数是多少?每个数字的字符数是多少?换行如何,有一个或两个字符?要使方法运行,必须知道特定数字从哪个字节/字符开始。