2016-01-25 3 views
0

Мне нужно создать школьную библиотеку в качестве назначения ООП. Я нахожу это очень трудно понять, на мой вопрос здесь:Динамическая переменная, основанная на txt-файле

int RANGE = total_books; 

total_books должен представлять текущие книги в текстовом файле. Форматирование позволяет читать 3 части информации (название, автор, жанр). Как я могу указать на это между функциями?

Я хочу загрузить программу и прочитать файл, чтобы узнать, сколько их сейчас (скажем, 7 книг, поэтому переменная должна быть 7 * 3 = 21). Затем, когда пользователь просматривает файл, он отобразит 7 книг.

В настоящее время это статический: у меня он установлен на 21. Если я добавлю другую книгу, он будет читать только первые 7 книг. Если я установил его равным 24, и есть 7 книг (а не 8 по мере необходимости), он сработает. Я пробовал смотреть эти форумы и другие места в Интернете, получил книгу «Программирование на C++ в простых шагах», вот где я получил этот код форматирования, но это не очень полезно.

#include "stdio.h" 
#include "malloc.h" 
#include "stdlib.h" 
#include "string.h" 
#include "conio.h" 
#include "fstream" 
#include "iostream" 
using namespace std; 

unsigned int number_of_books = 0; //this is based on the number of books *3 
int total_books = number_of_books * 3; //*3 to read 1 more book 

class Book 
{ 
    private: // properties 
    char Title[16]; 
    char Author[16]; 
    char Genre[16]; 
    public: // methods 
    int iDetailsGet(void); 
    int iDetailsShow(void); 
    int iRecordWrite(void);    
}; 

int Book::iDetailsGet(void) 
{ 
    // prompt for the data 
    fflush(stdout); 
    puts("\n \t !USE_UNDERSCORE_FOR_SPACE!"); 
    puts("\n \t Please enter the Book name: "); 
    fflush(stdin); 
    scanf("%s", Title, 16); 

    fflush(stdout); 
    puts("\n \t Please enter the Author: "); 
    fflush(stdin); 
    scanf("%s", Author, 16); 

    fflush(stdout); 
    puts("\n \t Please enter the Genre: "); 
    fflush(stdin); 
    scanf("%s", Genre, 16); 

    // Get total number of lines(books) 
    FILE *infile = fopen("books.txt", "r"); 
    int ch; 
    while (EOF != (ch = getc(infile))) 
    if ('\n' == ch) 
     ++number_of_books; // read from variable above but static. 
    printf("%u\n", number_of_books); 

    //return to menu 
    int main(); 
} // end method definition 

int Book::iDetailsShow() 
{ 
    system("CLS"); 
    int RANGE = total_books; // should be dynamically read on start up 
    string tab[RANGE]; 
    int i = 0, j = 0; 
    ifstream reader("books.txt"); 
    if(!reader) 
    { 
    cout << "Error Opening input file" << endl; 
    return -1; 
    } 

    while(!reader.eof()) 
    { 
    if((i + 1) % 3 == 0) // the 3 read title,author,genre then adds new line 
     getline(reader, tab[i++], '\n'); 
    else 
     getline(reader, tab[i++], '\t'); 
    } 

    reader.close(); 
    i = 0; 

    while (i < RANGE) 
    { 
    cout << endl << "Record Number: " << ++j << endl; 
    cout << "Title: " << tab[i++] << endl; 
    cout << "Author: " << tab[i++] << endl; 
    cout << "Genre: " << tab[i++] << endl; 
    } 
    int main(); 
} // end method definition 

// code for the method: iRecordWrite(void) 
int Book::iRecordWrite(void) 
{ 
    ofstream NewBook("books.txt", ios::app); 
    if (!NewBook) 
    { 
    printf("Error Recording Book"); 
    return -1; 
    } 
    NewBook << " " << Title << "  " << Author << " " << Genre << endl; 
    NewBook.close(); 
    int main(); 
} // end of method deinition 

Спасибо!

+2

Вы никогда не должны называть 'main' какой-либо функцией в вашей программе. – NathanOliver

+1

Код, который вы скопировали в скопированном виде, является довольно плохой смесью C и C++ (и что с прямыми объявлениями 'int main()')? Проблема, которую вы пытаетесь понять, - это динамически распределенные массивы. Возможно, вы можете использовать 'std :: vector', чтобы упростить вашу жизнь. – AndyG

+0

Также смотрите: [Почему iostream :: eof внутри условия цикла считается неправильным?] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – NathanOliver

ответ

0

Вместо инициализации total_books на основе number_of_books, когда он заявил, вероятно, вы должны установить его после того, как на самом деле чтениеnumber_of_books. Переменные, будь то глобальные или в области, не обновляются динамически. Итак, у вас может быть что-то вроде этого:

int number_of_books = 0; 

void read_number_of_books() { 
    // parse input file for value 
    total_books = number_of_books * 3; 
} 

Это то, что вы ищете?

Смежные вопросы