繁体   English   中英

从文件中,如何从C ++中的特定点读取

[英]From a file, how do I read from a certain point in C++

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

我如何获取每个对象的信息(引擎,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

如何跳过阅读“引擎”?

如果您不想检查读取的内容,则可以将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 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. 使用\\n分隔符的std::getline读取其余行,然后使用std::istringstream解析并格式化格式化。

在这两种情况下,您都可以知道该值后面是否有一些多余的字符。

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

由于每个字段都位于单独的行上,因此您可以阅读每个文本行,并在文本开头搜索“ engine”。

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

如果必须逐行读取,则最好逐条读取记录。 也就是说,让记录对象从文件中读取其成员。

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

我是否说过闻起来像可以使用数据库?

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

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

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

研究数据库理论,尤其是范式。 使用数据库时,您将从这些知识中受益匪浅。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM