从文件访问数据

时间:2014-12-22 06:02:48

标签: c++ file-io fstream

我知道在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文件。有一个&#39; LF&#39;在每一行的末尾。

问题是运行代码只会导致列出文件名。似乎&#34;而(文件&gt;&gt;数字)&#34;没有返回任何内容来运行print语句。事情是,主题上的其他主题(至少对我而言)表明它就像这样简单。

我觉得答案可能会涉及到我在过去几个小时里看过的事情 - 虚拟字符串变量,以吸收文件顶部的所有内容我不会这样做。需要吗?函数getline? &#39;令牌&#39 ;?我会告诉你我所有的努力,但我不想陷入这个问题:

鉴于上面格式化的txt文件,您如何访问第4行以后的值?

任何帮助都非常感谢:)

1 个答案:

答案 0 :(得分:2)

这里的问题是,您没有阅读标题信息。 >>操作失败,因为您尝试将字符串“version:1”作为float读入。

要解决此问题,您应该跳过标题,只需调用std::getline,或者解析它以获取有关内容的信息。

编辑:要跳过您可以执行的操作:

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