2015-05-02 2 views
0

Я пишу программу, которая принимает текстовый файл с результатами рекламной кампании и должна найти средний рейтинг кампании для 4 разных демографических данных. Я думаю, что я все это понял, просто борясь с получением данных из файла и в переменные char и int. Должен ли я читать все это как строки, а затем преобразовывать или читать их в эти переменные?Нужна помощь в получении данных char и int из файла

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <string> 
using namespace std; 

int main(){ 
//declare vars 
ifstream fileIn; 
string path; 
string name; 
char yn; 
int age; 
double rating; 
double rate1 = 0; 
double rate1Count = 0; 
double avg1 = 0; 
double rate2 = 0; 
double rate2Count = 0; 
double avg2 = 0; 
double rate3 = 0; 
double rate3Count = 0; 
double avg3 = 0; 
double rate4 = 0; 
double rate4Count = 0; 
double avg4 = 0; 
double totalAvg = 0; 

cout << fixed << showpoint << setprecision(2); 

// prompt user 
cout << "Please enter a path to the text file with results: "; 

// get path 
cin >> path; 
cout << endl; 

// open a file for input 
fileIn.open(path); 

// error message for bad file 
if (!fileIn.is_open()){ 
    cout << "Unable to open file." << endl; 
    getchar(); 
    getchar(); 
    return 0; 
} 

// read and echo to screen 
cout << ifstream(path); 

// restore the file 
fileIn.clear(); 
fileIn.seekg(0); 
cout << endl << endl; 

// get average for demos 

while (!fileIn.eof){ 
    fileIn >> name; 
    fileIn >> yn; 
    fileIn >> age; 
    fileIn >> rating; 

    if (yn != 121 && age < 18){ 
     rate1 += rating; 
     rate1Count++; 
    } 
    if (yn == 121 && age < 18){ 
     rate2 += rating; 
     rate2Count++; 
    } 
    if (yn != 121 && age >= 18){ 
     rate3 += rating; 
     rate3Count++; 
    } 
    if (yn == 121 && age >= 18){ 
     rate4 += rating; 
     rate4Count++; 
    } 

} 

avg1 = rate1/rate1Count; 
avg2 = rate2/rate2Count; 
avg3 = rate3/rate3Count; 
avg4 = rate4/rate4Count; 

cout << yn << age << rating; 



// pause and exit 
getchar(); 
getchar(); 
return 0; 

}

Текстовый файл

Бейли Y 16 68

Харрисон N 17 71

Грант У 20 75

Петерсон N 21 69

Хсу Y 20 79

Боулз Y 15 75

Андерсон N 33 64

Нгуен N 16 68

Sharp N 14 75

Джонс У 29 75

McMillan N 19 8

Gabriel N 20 62

+1

Когда вы задаете здесь вопрос, вы должны сказать, какую конкретную проблему вы заметили ... так как вы не сказали нам, какой аспект ввода вашего файла не работает, то есть какая у вас проблема наблюдаемые в данных, которые вам удалось прочитать, независимо от того, будут ли они навсегда или сбой и т. д. –

ответ

1

Ditch cout << ifstream(path); ... fileIn.seekg(0); - все это бесполезно.

Для входа используйте:

while (fileIn >> name >> yn >> age >> rating) 
{ 
    ... 

Это приведет к выходу, когда есть какая-то проблема становится ввод - то ли из-за недопустимые символы для данного типа (например, буквы при чтении числа), или с истекшим файлом ,

Нужно ли читать все как строки, а затем конвертировать или читать их в эти переменные?

Как и выше, вам не нужно, но вы можете получить лучшие качества ввода проверки и сообщения об ошибках для пользователя, если вы получаете каждую полную строку как string затем пытаться разобрать значение:

std::string line; 
for (int line_num = 1; getline(fileIn, line); ++line_num) 
{ 
    std::istringstream iss(line); 
    if (iss >> name >> yn >> age >> rating >> std::ws && 
     iss.eof()) 
     ...use the values... 
    else 
     std::cerr << "bad input on line " << line_num 
      << " '" << line << "'\n"; 
     // could exit or throw if desired... 
} 
+1

И для вывода используйте 'cout << yn <<" "<< age <<" "<< rating << std :: endl ; 'поэтому вы можете понять вывод , –

+0

Спасибо за ваш ответ! Я должен был упомянуть о своем требовании, прежде чем находить средние значения. Сделали некоторые изменения, как вы предложили, и все еще получаете ошибку ошибки C2678: двоичный '<<': оператор не найден, который принимает левый операнд типа 'std :: ostream' (или нет приемлемого преобразования) – Riley

+0

@Riley: мы не читатели разума; -P ... что такое * код * в строке, где сообщается об этой ошибке? –

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