为什么我的程序在.dat文件中写入同一行

时间:2015-04-09 11:25:42

标签: c++ oop

我正在创建一个图书馆管理系统。系统意味着从.dat文件写入和读取。但是,系统在将用户输入写入dat文件时遇到问题。这意味着在同一行写下书名,作者姓名和书条形码,然后当用户输入另一本书时,它意味着将其添加到另一行,但它只是覆盖现有数据,当我使用选项显示时它显示的所有数据都是混乱的文本。

有些人可以告诉我我做错了什么。

我已经包含了一些代码。 Main.cpp的

#include <iostream>
#include <string>
#include "Library.h"

int main() {
    Library lib1;

while(1)
{
   std::cout << "*   1              Add a new book                  *\n";
   std::cout << "*   2              Show all books                  *\n";

   std::cin >> name;
   bookOption = name;

   switch(bookOption)
   {
     case '1':
     {
       lib1.insertBook();
       break;
     }
     case '2':
     {
       lib1.showallBooks();
       break;
     }
}
return 0;
};

Book.h

#ifndef BOOK_H_
#define BOOK_H_

#include <string>
#include <iostream>
#include <fstream>
#include "Media.h"

class Book : public Media
{
public:
    std::string author;

public:
    void newBook();
void report();
};

Book.cpp

#include <string>
#include "Book.h"
#include "Student.h"

void Book::newBook()
{
    std::cout<<"Enter the Book Name: \n";
    getline(std::cin,name);
    std::cin.ignore();
    std::cout<<"Enter the Name of Author: \n";
    getline(std::cin,author);
    std::cin.ignore();
    std::cout<<"Enter the book barcode: \n";
    getline(std::cin,barcode);
    std::cin.ignore();
    std::cout<<"Book Added to the library\n";
}
void Book::report()
{
    std::cout<<"______________"<<" __________________"<<" _________________\n";
    std::cout<<"|Name of Book| "<<"|Director of Book| "<<"|Barcode of Book| \n";
    std::cout<<name<<author<<barcode<<"\n";
}

Media.h

#ifndef MEDIA_H_
#define MEDIA_H_

#include <string>

class Media
{
public:
    std::string barcode;
    std::string name;
    std::string num;

    std::string retBarcode()
        {
            return barcode;
        }
};

#endif 

Library.h

#ifndef _Library_H_
#define _Library_H_

#include <string>
#include <stdio.h>

class Library
{
public:
    void insertBook();
    void showallBooks();
};

#endif

Library.cpp

void Library::insertBook()
{

    std::ofstream bookData("book.dat", std::ios::app);
    if(!bookData)
    {
        std::cout<<"cannot open the user.dat file. \n";
    }
    book1.newBook();
    bookData << book1.name << book1.author << book1.barcode<<std::endl;
    bookData.close();
}
void Library::showallBooks()
{
    std::ifstream bookData("book.dat");
    if(!bookData)
    {
        std::cout<<"Error: File could not be opened. \n";
    }

    while(!bookData.eof())
    {
        bookData >> book1.name >> book1.author >> book1.barcode;
        book1.report();
    }

    bookData.close();
}

1 个答案:

答案 0 :(得分:0)

如果您要使用>>从文件中提取数据,则文件中的数据之间需要有空格。目前您正在使用:

bookData << book1.name << book1.author << book1.barcode<<std::endl;

这会将您的所有数据放在一行中,而它们之间没有任何内容。所以“foo”“foobar”“条形码”在文件中变成“foofoobarbarcode”,这将使用>>运算符回读。如果您将代码更改为:

bookData << book1.name << " " << book1.author << " " << book1.barcode << std::endl;

现在数据将按空格分隔,并且可以轻松读回。