Fstreams C ++在写作时有额外的空间

时间:2012-11-28 09:45:31

标签: c++

我想出了一些东西,但我吮吸fstreams,这只是杀了我,对于BREED + DESC,他们之间有一个空格和名字,但当我完全删除它们然后我没有空格而且它有效再次。有人能告诉我我做错了吗?

#include <iostream>
#include <fstream>
#include <cstring>
#include <cctype>
using namespace std;


const int NAME_SIZE = 100;
const int BREED_SIZE = 100;
const int DESC_SIZE = 250;
const int REASON_SIZE = 250;

//creating the struct
struct animal
{
//members
    char name[NAME_SIZE];
    char breed[BREED_SIZE];
    char desc[DESC_SIZE];
    char reason[REASON_SIZE];
    float age;
    float weight;
    int day;
    int month;
    int year;
    float length;
};

class petAdoption
{
    public:
        petAdoption();
        void enroll(animal newAnimal[], int & count);
        void read(animal newAnimal[], int & count);
        //void display(animal & newAnimal);
        //void adopt(animal & newAnimal); 
    private:


};
petAdoption::petAdoption()
{

}

int main()
{
int count = 0;
animal * newAnimal = new animal[count];
petAdoption adopt;
adopt.read(newAnimal, count);
adopt.enroll(newAnimal, count);
delete[] newAnimal;
}


void petAdoption::read(animal newAnimal[], int & count)
{
    int pets = 0;
    ifstream read;
    read.open("pets.txt");
    if(!read)
    {
        cout << "Checking... File doesn't exist!" <<endl;
    }
    else 
    {
        while(!read.eof())
        {
        read.getline(newAnimal[pets].name, NAME_SIZE, '\n');
        read.ignore(100, '\n');
        ++pets;
        }
    count = pets + 1;
    }
    read.close();

    for (int i = 0; i < pets; ++i){
        read.open(newAnimal[i].name);
            if( !read)
            {
                cout << "Checking... File doesn't exist!" <<endl;
            }
        else{
            while(!read.eof())
            {
                read.getline(newAnimal[i].name, NAME_SIZE, '\n');
                read.getline(newAnimal[i].breed, BREED_SIZE, '\n');
                read.getline(newAnimal[i].desc, DESC_SIZE, '\n');
                read.getline(newAnimal[i].reason, REASON_SIZE, '\n');
                read.ignore(100, '\n');
                read >> newAnimal[i].age;
                read >> newAnimal[i].weight;
                read >> newAnimal[i].day;
                read >> newAnimal[i].month;
                read >> newAnimal[i].year;
                read >> newAnimal[i].length;
                read.ignore(100, '\n');
            }
        }
        read.close();
    }
}


/*
ENROLL FUNCTION
*/

void petAdoption::enroll(animal newAnimal[], int & count)
{
//making a write variable
    ofstream write;

//stores the name into the struct member
    cout << "Please enter a name: ";
    cin.get(newAnimal[count].name, NAME_SIZE, '\n');
    cin.ignore(100, '\n');
    cout << "Please enter a breed: ";
    cin.get(newAnimal[count].breed, BREED_SIZE, '\n');
    cin.ignore(100, '\n');
    cout << "Please enter a desc: ";
    cin.get(newAnimal[count].desc, DESC_SIZE, '\n');
    cin.ignore(100, '\n');
    cout << "Please enter a reason (EG: eats people): ";
    cin.get(newAnimal[count].reason, REASON_SIZE, '\n');
    cin.ignore(100, '\n');
    cout << "Please enter an age (EG: 5): ";
    cin >> newAnimal[count].age;
    cin.ignore(100, '\n');
    cout << "Please enter a weight (in LBS): ";
    cin >> newAnimal[count].weight;
    cin.ignore(100, '\n');
    cout << "Please enter a day (EG: 2): ";
    cin >> newAnimal[count].day;
    cout << "Please enter a month (EG: 11): ";
    cin >> newAnimal[count].month;
    cout << "Please enter a year (EG: 2002): ";
    cin >> newAnimal[count].year;
    cout << "How long has the pet been in a shelter? (in months): ";
    cin >> newAnimal[count].length;


//error
    if(!write)
    {
        cout << "Invalid File" << endl;
    }
    else{
        write.open(newAnimal[count].name, ios::app);    
        write << newAnimal[count].name << '\n'
        << newAnimal[count].breed << '\n'
        << newAnimal[count].desc << '\n'
        << newAnimal[count].reason << '\n'
        << newAnimal[count].age << '\n'
        << newAnimal[count].weight << '\n'
        << newAnimal[count].day << '\n'
        << newAnimal[count].month << '\n'
        << newAnimal[count].year << '\n'
        << newAnimal[count].length << '\n';
        write.close();
    }
    if(!write) 
    {
        cout << "Invalid File";
    }
    else {
        write.open("pets.txt", ios::app);
        write << newAnimal[count].name << '\n';
        write.close();  
    }               
}

1 个答案:

答案 0 :(得分:1)

正如人们所提到的(已经回答了这个问题的早期版本),你不应该使用eof()来控制你的循环。此外,在您[尝试]阅读之后,您将测试您是否已成功收到输入。

如果一行是由于您使用get()而不是getline()而导致额外换行的问题:前者保留停止字符,而后者则不然。您应该考虑将std::stringstd::getline()一起使用:它会读取任意长度的字符串。