Мне нужно создать школьную библиотеку в качестве назначения ООП. Я нахожу это очень трудно понять, на мой вопрос здесь:Динамическая переменная, основанная на 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
Спасибо!
Вы никогда не должны называть 'main' какой-либо функцией в вашей программе. – NathanOliver
Код, который вы скопировали в скопированном виде, является довольно плохой смесью C и C++ (и что с прямыми объявлениями 'int main()')? Проблема, которую вы пытаетесь понять, - это динамически распределенные массивы. Возможно, вы можете использовать 'std :: vector', чтобы упростить вашу жизнь. – AndyG
Также смотрите: [Почему iostream :: eof внутри условия цикла считается неправильным?] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – NathanOliver