1

外部テキスト ファイルから書籍に関する情報を読み取り、その情報を配列に格納し、各書籍のタイトルと価格を含む新しいファイルを書き込む C++ プログラムを作成しています。コンパイル時にはエラーはありませんが、プログラムを実行すると、画面にポップアップする大量のメモリ位置とエラーが表示されます

「スレッド 1: EXC_BAD_ACCESS (コード 2)」

それが重要な場合は、Intel Macでxcodeを使用しています。問題のスクリーン ショットをいくつか含むコードを以下に示します。ありがとう

コード:

//main.cpp

include <iostream>
include <fstream>
include "Book.h"
include "textbook.h"
include "Name.h"
using namespace std;

int main() 
{

string title, authorf, authorl, publisher, isbn, subject;
int pages, i = 0, j = 0;
float price, rentalp;
char code;
static int bookCount = 0, textbookCount = 0;

ifstream file1, file2;
ofstream newFile;

file1.open("/Users/TVaughn/Documents/School Stuff/Fall 2012/CS 246/In Class Programs/Book/Book/Data.txt", ios::in); //Opening the data.txt file to read from.
newFile.open("/Users/TVaughn/Documents/School Stuff/Fall 2012/CS 246/In Class Programs/Book/Book/Title.txt", ios::out); //Creating a new file to store titles & prices of all the books.

book bookList[3];

while (!file1.eof()) {

    getline (file1, title, ',');
    getline (file1, authorf, ',');
    getline (file1, authorl, ',');
    getline (file1, publisher, ',');
    getline (file1, isbn, ',');
    file1 >> pages;
    file1.ignore();
    file1 >> price;
    file1.ignore();
    file1 >> code;
    file1.ignore(10, '\n');

    book b1(title, authorf, authorl, publisher, pages, isbn, price, code);
    bookList[i] = b1; //initalizing the first element of the array to b1
    newFile << "Title: " << bookList[i].getTitle() << "\n" << "Price: " << bookList[i].getPrice() << "\n\n"; //storing the title and price of all the books in a new file called titles.
    bookList[i].PrintBook();
    i++;
    bookCount++;

 }

 file1.close();

file2.open("/Users/TVaughn/Documents/School Stuff/Fall 2012/CS 246/In Class Programs/Book/Book/TextbookData.txt", ios::in); //Opening the TextbookData.txt file to read from.
textbook TbookList[2];

while (!file2.eof()) {

    getline (file2, title, ','); //retrieving info from data.txt and storing that info into variables so the variable may be passed as arguments in my textbook object b2.
    getline (file2, authorf, ',');
    getline (file2, authorl, ',');
    getline (file2, isbn, ',');
    file2 >> pages;
    file2.ignore();
    file2 >> price;
    file2.ignore();
    getline(file2, subject, ',');
    file2 >> code;
    file2 >> rentalp;
    file2.ignore(10, '\n');

    textbook b2(title, authorf, authorl, publisher, pages, isbn, price, code, subject, rentalp);
    TbookList[j] = b2; //initalizing the first element of the array to b2.
    newFile << "Title: " << bookList[j].getTitle() << "\n" << "Price: " << bookList[j].getPrice() << "\n\n";
    TbookList[j].PrintBook();
    j++;
    textbookCount++;

}

file2.close();
newFile.close();

cout << "Number of books: " << bookCount << "\nNumber of textbooks: " << textbookCount << endl;

book b3("C++ Data Structures", "Nell B.", "Dale", "Jones & Bartlett Publishers", 781, "9780763741587", 107.67, 'A'); //This line is used to test the exception handeling.

try {

    b3.setPrice(price);
    b3.setPages(pages);

}

catch (book::negativeNumber) {

    cout << "Negative price was entered \n\n" << "End of program \n";
}

return 0;
}




//book.h
#include <iostream>
#include "Name.h"
#include <string>
using namespace std;

#ifndef BOOK_H
#define BOOK_H

class book
{
private:
    string title; 
    Name aurthor; 
    string publisher; 
    string ISBN; 
    int pages; 
    float price; 
    char code; 


public:
    class negativeNumber{};
    void setTitle(string);
    void setAurthor(string f, string l);
    void setPublisher(string);
    void setISBN(string);
    void setPages(int);
    void setPrice(float);
    void setCode(char);
    string getTitle();
    Name getAurthor();
    string getPublisher();
    string getISBN();
    int getPages();
    float getPrice();
    char getCode();
    void PrintBook();
    book(); //default constructor
    book(string, string, string, string, int, string, float, char); 
    ~book(); //Destructor


};
#endif




//Book.cpp
#include <iostream>
#include <string>
#include "Book.h" 
#include "Name.h"
using namespace std;

book::book() {

title = "Southern Charm";
Name::Name(); 
publisher = "Impact Publishers";
pages = 223;
ISBN = "234-232-10009045";
price = 14.99;
code = 'L';

}

book::book(string the_title, string f, string l, string the_pub, int page_num, string the_ISBN, float the_price, char the_c)
{
title = the_title;
//Name(f, l);
aurthor.setfName(f);
aurthor.setlName(l); 
publisher = the_pub;
pages = page_num;
ISBN = the_ISBN;
price = the_price;
code = the_c;

}

book::~book()
{

}

void book::setTitle(string t)
{
title = t;
}

void book::setAurthor(string f, string l)
{
aurthor.setfName(f);
aurthor.setlName(l);
}

void book::setPublisher(string pub)
{
publisher = pub;
}

void book::setISBN(string ISBN_num)
{
ISBN = ISBN_num;
}

void book::setPages(int p) {

if (pages > 0) 
    pages = p;
else
    throw negativeNumber();


}

void book::setPrice(float cost) {

if (price >= 0) //This is called exception handling. 
    price = cost;

    else
        throw negativeNumber();


}

void book::setCode(char c) {
code = c;
}

string book::getTitle() {
return title;
}


Name book::getAurthor(){

return aurthor;

}


string book::getPublisher() {

return publisher;
}

string book::getISBN(){

return ISBN;
}

int book::getPages() {

return pages;
}

float book::getPrice() {

return price;
}

char book::getCode() {

return code;
}

void book::PrintBook() {

cout << "Title: " << getTitle() << "\n" << "Aurthor: ";
getAurthor().printName();
cout << "Publisher: " << getPublisher() << "\n" << "Pages: " << getPages() << "\n" << "ISBN: " << getISBN() << "\n" << "Price: " << getPrice() << "\n" << "Code: " << getCode() << "\n \n \n";
}
4

1 に答える 1

0

ここに私に飛び出したいくつかのポイントがあります:

  1. 私のマントラ:あなたはあなたの読書の後に読書がうまくいったことを確認しなければなりません。
  2. の使用はstd::ios_base::eof()、前回の読み取りが失敗した理由を判別するためにのみ有効です。
  3. あなたの実際の問題は、3冊以上の本があるとどうなるかということです。(答える必要はありません:私は何が起こるか知っています...)
  4. エキスパートプログラマーは、長い機能を正しく取得するのに苦労しています。初心者にはチャンスがありません!コードを消化可能で一貫性のあるチャンクに分割してください!

問題を修正して再試行してください。

于 2012-10-08T18:41:12.453 に答える