从文件访问数据

Accessing data from file

本文关键字:数据 访问 文件      更新时间:2023-10-16

我知道这在SO(和其他地方(上已经讨论了很多。我在这里问,因为我仍然被困住了。也许我正在做一些非常无脑/愚蠢的事情,或者这是一个真正的陷阱......

我有一个文件目录,每个文件都有扩展名为".pts" - 打开一个会显示:

版本: 1

n_points: 68

{

498.801220 504.771171

516.076459 571.681686

518.038170 628.516761 ...

粘贴到此处会使格式有点错误,因此请注意,每行数据之间没有空行。这些浮点对中也有 68 个,但我在这里省略了它们。

最终,我想要一个圆形短裤对的矢量 - 例如 499、505、516、572、518、629 ...

但目前我无法按原样访问浮标,更不用说任何信息了。

到目前为止的代码:

#include <iostream>
#include <string>
#include "dirent.h"
#include <fstream>
#include <sstream>
#include <stdio.h>
using namespace std;
bool has_suffix(const string& s, const string& suffix)
{
    return (s.size() >= suffix.size()) && equal(suffix.rbegin(), suffix.rend(), s.rbegin());    
}
int main(int argc, char **argv)
{
    string path = "C:\testset";
    DIR *dir = opendir(path.c_str());
    if(!dir)
    {
        return 1;
    }
    dirent *entry;
    string fileName;
    float number;
    string dummy;
    while(entry = readdir(dir))
    {
        if(has_suffix(entry->d_name, ".pts"))
        {
            fileName = entry->d_name;
            fileName = path + "\" + fileName;   // <<added at suggestion of Martin James
            //Working up to here as I see all the .pts files listed when I print them:
            cout << fileName << endl;
            ifstream file(fileName, std::ios_base::in);
            //however from here:
            while (file >> number)
            {
                //...nothing will print
                printf("%f ", number);
            }
            file.close();
        }
    }
    closedir(dir);
}

查找所有 .pts 文件都可以工作(感谢 SO :) 上的其他线程 - 当它们在文本编辑器中打开时,它们看起来确实是简单的 .text 文件。每行末尾都有一个"LF"。

问题是运行代码只会导致列出文件名。似乎"while(文件>>号("没有返回任何内容来运行 print 语句。问题是,关于该主题的其他线程表明(至少对我来说(它就这么简单。

我觉得答案很可能涉及我在过去几个小时内看过的东西 - 虚拟字符串变量来吸收我不需要的文件顶部的所有内容?"代币"?我会向你展示我所有的尝试,但我不想陷入这个问题:

给定一个格式如上格式的 txt 文件,您将如何访问从第 4 行开始的值?

任何帮助非常感谢:)

这里的问题是,您没有读取标题信息。>>操作失败,因为您尝试将字符串"version: 1"作为浮点数读取。

若要解决此问题,应跳过标头,只需调用少量std::getline,要么对其进行分析以获取有关内容的信息。

编辑:要跳过这些行,您可以执行以下操作:

for(int i=0;i<3;i++) //Skip header
     std::getline(file,dummy);