簡體   English   中英

我的ifstream方法有什么問題?

[英]What is wrong with my ifstream method?

在我的班級中,我有這個ifstream方法,需要它來讀取文件並將信息寫入已創建的對象中,代碼出了點問題首先,a.engiene值在值之前插入了一個空格-“汽油”

並且當第二個對象和第三個對象被賦予值時,該方法不會為每個屬性分配正確的值。

 friend ifstream& operator>>(ifstream& in, Auto &a)
        {
            char temp[31];
            temp[0] = '\0';
            in.getline(temp, 30, ':');

            if (temp[0])
            {
                in.getline(temp, 30, ':');
                delete[]a.engine;
                a.engine = new char[strlen(temp) + 1];
                strcpy(a.engine, temp);

                in.getline(temp, 30, ':');
                a.max_speed = atoi(temp);

                in.getline(temp, 30, ':');
                a.engine_cc = atoi(temp);

                in.getline(temp, 30, ':');
                a.avg_consumption_urban = atoi(temp);

                in.getline(temp, 30, ':');
                a.avg_speed_urban = atoi(temp);

                in.getline(temp, 30, ':');
                a.avg_consumption = atoi(temp);

                in.getline(temp, 30, ':');
                a.avg_speed = atoi(temp);

                return in;
            }
            else return in;

這就是我在main中調用方法的方式:

        ifstream f1("autoc.txt", ios_base::in);
                f1 >> auto1 >> auto2 >> auto3;

這是文件數據:

    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

這是輸出窗口: http : //imgur.com/tHe49se

這不是我其他問題的重復。 我有幾乎可以工作的這段代碼。 我需要使它為每個對象的屬性分配正確的值。

in.getline(temp, 30, ':');

最多讀取: ,這是屬性名稱。 您還希望在此之后提取值,因此您需要添加

in.getline(temp, 30);

每次之后

in.getline(temp, 30, ':');

但是請記住,您的程序完全忽略了屬性名稱,只是按照值的順序排列。 希望這能徹底解決您的問題。

恐怕要添加一個更簡潔的版本(您可能會再次詢問),所以我只提及它(就像我在原始問題的答案中所做的那樣)。 這是關於使用std::string temp; std::getline而不是std::istream::getline

我相信您可以將大多數解析委托給STL本身。 您的“汽車”格式似乎是固定的,並且具有固定的順序,這極大地簡化了解析方法(不清楚是否堅持使用“ char [31]”,但如果不是,您顯然會使用std :: string更好,因為我添加到Auto結構中的“名稱”字段就是這種情況)

工作樣本:

#include <fstream>
#include <locale>
#include <iostream>
#include <string>


struct SeparatorReader: std::ctype<char>
{
    template<typename T>
    SeparatorReader(T &&seps):
        std::ctype<char>(get_table(seps), true) {}

    template<typename T>
    std::ctype_base::mask const *get_table(T &&seps) {
        auto rc = new std::ctype_base::mask[std::ctype<char>::table_size]();
        for(auto &sep: seps)
            rc[static_cast<unsigned char>(sep)] = std::ctype_base::space;
        return &rc[0];
    }
};


struct Auto
{
    std::string name;
    char engine[31];
    int max_speed;
    int engine_cc;
    int avg_consumption_urban;
    int avg_speed_urban;
    int avg_consumption;
    int avg_speed;

    Auto(const std::string &name) : name(name) {}

    friend std::istream &operator >>(std::istream &is, Auto &a);
    friend std::ostream &operator <<(std::ostream &os, const Auto &a);
};

std::istream &operator >>(std::istream &is, Auto &a)
{
    char tmp[31] = "";

    is >> tmp; is >> a.engine; // skip field name, read value
    is >> tmp; is >> a.max_speed;
    is >> tmp; is >> a.engine_cc;
    is >> tmp; is >> a.avg_consumption_urban;
    is >> tmp; is >> a.avg_speed_urban;
    is >> tmp; is >> a.avg_consumption;
    is >> tmp; is >> a.avg_speed;

    return is;
}

std::ostream &operator <<(std::ostream &os, const Auto &a)
{
    os << a.name << std::endl;
    os << "engine: " << a.engine << std::endl;
    os << "max_speed: " << a.max_speed << std::endl;
    os << "engine_cc: " << a.engine_cc << std::endl;
    os << "avg_consumption_urban: " << a.avg_consumption_urban << std::endl;
    os << "avg_speed_urban: " << a.avg_speed_urban << std::endl;
    os << "avg_consumption: " << a.avg_consumption << std::endl;
    os << "avg_speed: " << a.avg_speed << std::endl;

    return os;
}

int
main(int argc, char *argv[])
{
    std::ifstream stream(argv[1]);
    stream.imbue(std::locale(stream.getloc(), new SeparatorReader(" :\n")));

    std::string name;
    while(stream >> name) {
        Auto a(name);
        stream >> a;

        std::cout << "------------------------------" << std::endl;
        std::cout << a;
    }
}

如果我們將樣本文件與您的樣本輸入一起傳遞...,輸出為:

------------------------------
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM