从文件中,我如何从C ++中的某个点读取

时间:2015-12-17 22:19:04

标签: c++ file oop ifstream

我想做什么: 我需要在void main()3中创建自动对象。 对于每个对象,我都有一个txt文件中的信息。

如何获取每个对象的信息(engine,max_speed ...等)。我如何跳过阅读"引擎"以及如何在创建第二个对象时跳过整个自动。谢谢!

txt文件:(auto.txt)

    auto1
    engine: gasoline
    max_speed: 250
    engine_cc: 1980
    avg_consumption_urban: 11
    avg_speed_urban: 50
    avg_consumption: 8
    avg_speed: 100
    auto2
    engine: diesel
    max_speed: 230
    engine_cc: 1600
    avg_consumption_urban: 9
    avg_speed_urban: 50
    avg_consumption: 6
    avg_speed: 80
    auto3
    engine: hybrid
    max_speed: 190
    engine_cc: 1450
    avg_consumption_urban: 7
    avg_speed_urban: 50
    avg_consumption: 4
    avg_speed: 90

我到目前为止(我使用更简单的auto.txt版本来阅读和显示此代码 - 请参阅下面的简单版本的txt文件):

这是我在Auto类中的ifstream方法

    friend ifstream& operator>>(ifstream& in, Auto &a)
        {
            delete[]a.engine;
            a.engine = new char[10];
            in >> a.engine;
            in >> a.max_speed;
            in >> a.engine_cc;
            in >> a.avg_consumption_urban;
            in >> a.avg_speed_urban;
            in >> a.avg_consumption;
            in >> a.avg_speed;
            return in;
        }

这就是我从void main

中读取文件的方式
    ifstream f("auto.txt", ios_base::in);
        f >> auto1;
        auto1.display();
        f.close();

这是我读到的文字。这是一个简化版本。

    gasoline
    250
    1980
    11
    50
    8
    100

2 个答案:

答案 0 :(得分:0)

  

如何跳过阅读“引擎”?

如果您不想查看读取的内容,可以将std::ifstream::ignore与自定义分隔符一起使用:

f.ignore(std::numeric_limits<std::streamsize>::max(), ':');

但是看到这些键被:或其值中的空格分隔,您也可以使用std::getline来读取:或简单operator>>来读取std::string直到包含:的空白,然后检查。

  

如何跳过整个自动?

如果您的意思是将另一个Auto写入文件,则可以使用std::ios_base::out | std::ios_base::app以追加模式打开该文件。

另一方面,如果您的意思是阅读信息,您可以通过重复调用(在循环中)跳过看似常数的行:

f.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

修改

要阅读:之后的值,您可以使用:

  1. operator>> - 格式化提取,然后std::getlinestd::istream::ignore行的其余部分(\n作为分隔符),以便下一个std::getline正确读取下一行
  2. std::getline使用\n分隔符读取该行的其余部分,然后使用std::istringstream进行解析并格式化提取。
  3. 在这两种情况下,您都可以知道值后是否有多余的字符。

答案 1 :(得分:0)

在文件格式中,没有有效的方法来定位给定记录。记录是可变大小的,例如,一个具有100(3个字符)的引擎速度而另一个具有80(2个字符)。

由于每个字段都在一个单独的行上,您可以阅读每个文本行,搜索&#34; engine&#34;在文本的开头。

这个项目闻起来像是可以使用数据库。

如果您必须逐行阅读,您还可以逐个阅读记录。也就是说,让记录对象从文件中读取其成员。

如果在读取记录之前获得文件位置,则可以将信息存储到std::map<unsigned int, Engine>中,并使用文件指针作为地图的索引。

我说这闻起来像是可以使用数据库吗?

另一个想法是读入所有记录并将它们推入std::vector。创建std::map<unsigned int, unsigned int>以将矢量索引映射到文件位置。

仍然闻起来像你应该使用数据库。

通过将Engine记录放入向量,您可以创建其他索引表(数据库可以为您创建索引表)。例如,std::map<string, unsigned int>将引擎类型映射到矢量索引。

研究数据库理论,特别是普通形式。使用数据库时,您将从这些知识中受益匪浅。