C ++ преобразование данных TXT-файла в двойные переменные

Привет, поэтому я начал создавать программу для расчета среднего балла человека и сохранить эту информацию для дальнейшего использования. Моя проблема в том, что я не могу понять, как прочитать числа, сохраненные в файле .txt, а затем сохранить их для целей расчета GPA. Вот код незавершенной программы, и любая помощь будет отличной

РЕДАКТИРОВАТЬ:. TXT файл выглядит следующим образом: 5,0 3,7 5,0 3,7 5,0 4,0 … Ниже мой прогресс в программе, но когда я запускаю ее, я получаю средний балл 0 (неверно). Не уверен, что лексическое приведение — моя проблема, метод getline () или что-то еще. Любая помощь (метод calcGPA () является проблемной зоной)?

#include <iostream>
#include <fstream>
#include <string>
#include <boost/lexical_cast.hpp>
using namespace std;

string newCC, newCG;
double curGPA;
char command;
bool running = 1;

void calculateGPA();
void writeGrades();
void mainMenu();
void addClass();

int main()
{
while(running) {
mainMenu();
}

return 0;
}

void calculateGPA()
{
double credit_sum = 0.0, grade_sum = 0.0;
double credit, grade;

ifstream gReader("grades.txt");

for( int i = 0; ! gReader.eof() ; i++ )
{
string number;

getline( gReader , number ) ;

double dblNumber;
try
{
dblNumber = boost::lexical_cast<double>(number);
}
catch (boost::bad_lexical_cast const&)
{
dblNumber = 0;
}

credit_sum = credit_sum + dblNumber;
}

ifstream cReader("credits.txt");

for( int i = 0; ! cReader.eof() ; i++ )
{
string number;

getline( cReader , number ) ;

double dblNumber;
try
{
dblNumber = boost::lexical_cast<double>(number);
}
catch (boost::bad_lexical_cast const&)
{
dblNumber = 0;
}
credit_sum = credit_sum + dblNumber;
}

if(credit_sum == 0.0) {

curGPA = 0.0;
}

curGPA = (grade_sum / credit_sum);

cReader.close() ;
gReader.close() ;

}//End calculateGPA

void writeGrades()
{
string cToWrite = newCC + "\n";
string gToWrite = newCG + "\n";

ofstream cWriter("credits.txt", ios::app);
cWriter << cToWrite;
ofstream gWriter("grades.txt", ios::app);
gWriter << gToWrite;

cWriter.close();
gWriter.close();
}//End writeGrades

void addClass()
{
cout << "New class' credits?"; cin >> newCC;
cout << endl << "New class' grade? (GP)"; cin >> newCG;
writeGrades();
cout << "Add another class? (y/n)" << endl; cin >> command;
if(command == 'y')
addClass();
else mainMenu();
}//End addClass

void mainMenu()
{
string command;

cout << "What would you like to do?" << endl;
cout << "(V)iew GPA" << endl;
cout << "(A)dd grades" << endl;
cout << "(E)xit" << endl;

cin >> command;

if(command == "v")
{
calculateGPA();
cout << "Your current GPA is " << curGPA << endl;
}
else if(command == "a")
{
addClass();
}

else running = 0;

}//End mainMenu

-1

Решение

Использование потоков:

double calculateGPA() {
double credit_sum = 0.0, grade_sum = 0.0;
double credit, grade;
ifstream reader("grades.txt");

while (!reader.eof()) { /* while the file still has numbers to be read */
reader >> credit >> grade;

if (reader.fail()) {
/* something unexpected happened (read error/formatting error) */
break;
}

credit_sum += credit;
grade_sum += grade;
}

if(credit_sum == 0.0) {
/* avoid divide by zero */
return 0.0;
}

/* divide the total grade by the total credits */
return grade_sum / credit_sum;
}

Заметки:

  • Предполагается, что файл .txt содержит только цифры (кредиты, оценки, кредиты, оценки, …), разделенные пробелами (пробелы или
    разрывы строк): для более сложного форматирования вы хотите использовать scanf или
    регулярное выражение.
  • Возвращает double вместо float, обычно вам нужна точность double
    относительно небольшое преимущество по скорости и памяти.
  • Файл будет закрыт в конце функции, когда читатель выйдет
    области видимости reader.close () не обязателен, но не будет плохим
    вещь, чтобы положить в (я просто ленивый.)
0

Другие решения

Посмотрите на эту функцию: http://www.cplusplus.com/reference/cstdlib/atof/

Вы можете использовать его для преобразования читаемой строки (или символа) в число типа double. Я предполагаю, что вы хотите удвоить, потому что оценки 4,0, 3,7, 3,3, 3,0 и т. Д.

0

Или вы можете прочитать в двойном напрямую.

calculateGPA()
{
double credit;
...
reader >> credit;
...
}

Кроме того, в вашей функции WriteGrades вы пишете новые строки (используйте endl вместо ‘\ n’) перед строкой, а не в конце?

0
По вопросам рекламы [email protected]