2013-04-02 2 views
0

У меня есть файл с номером, в котором указано число имен. Например:Чтение файла C++

4 
bob 
jim 
bar 
ted 

im пытается написать программу для чтения этих имен.

void process_file(ifstream& in, ofstream& out) 
{ 
    string i,o; 
    int tmp1,sp; 
    char tmp2; 
    prompt_user(i,o); 
    in.open (i.c_str()); 

    if (in.fail()) 
    { 
     cout << "Error opening " << i << endl; 
     exit(1); 
    } 

    out.open(o.c_str()); 
    in >> tmp1; 
    sp=tmp1; 

    do 
    { 
     in.get(tmp2); 
    } while (tmp2 != '\n'); 

    in.close(); 
    out.close(); 
    cout<< sp; 
} 

До сих пор я в состоянии прочитать первую строку и присвоить Int к зр

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

+0

замените 'while (in >> tmp1)' только с помощью 'in >> tmp1'. Вы tmp1, чтобы иметь целочисленное значение, а не что-то еще. –

+0

Что вы пытаетесь достичь в цикле 'while (in >> tmp1) sp = tmp1;'? – Vyktor

+1

Итак, я полагаю, вы знаете, как использовать 'for' для создания цикла 'x times'? –

ответ

1
while (in >> tmp1) 
     sp=tmp1; 

Это успешно читает первый int из, а затем пытается продолжить. Поскольку вторая строка не является номером int, извлечение завершается с ошибкой, поэтому он останавливается. Все идет нормально.

Однако поток теперь находится в состоянии fail, и все последующие экстракции проваливаются, если вы не очистите флаги ошибок.

Скажите in.clear() сразу после первого while.

Я действительно не понимаю, почему вы написали цикл, чтобы извлечь одно целое. Вы могли бы просто написать

if (!(in >> sp)) { /* error, no int */ } 

Чтобы прочитать имена, читать в string с. Цикл прекрасно это время:

std::vector<std::string> names; 
std::string temp; 

while (in >> temp) names.push_back(temp); 

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

+0

Я отредактировал свою программу, и теперь она назначает 3 на sp. Проблема, которую я оставил, - это получить имена. При игнорировании номера –

0
int lines; 
string line; 
inputfile.open("names.txt"); 
lines << inputfile; 
for(i=0; i< lines; ++i){ 
    if (std::getline(inputfile, line) != 0){ 
     cout << line << std::endl; 
    } 
} 
0

Прежде всего, при условии, что в первом цикле:

while (in >> tmp1) 
    sp=tmp1; 

предназначен для считывания числа в начале, этот код должен делать:

in >> tmp1; 

Согласно manualoperator>> :

Объект istream (* this).

Выделенное значение или последовательность не возвращаются, но сохраняются в памяти в переменной, переданной как аргумент.

Так что не использовать его в состоянии, а использовать:

in >> tmp1; 
if(tmp1 < 1){ 
    exit(5); 
} 

Во-вторых, никогда не полагаться на предположении, что файл правильно отформатирован:

do { 
    in.get(tmp2); 
    cout << tmp2 << endl; 
} while ((tmp2 != '\n') && !in.eof()); 

Хотя весь алгоритм кажется мне немного неуклюжим, это должно предотвратить бесконечный цикл.

0

Вот простой пример того, как читать указанное количество слов из текстового файла так, как вы хотите.

#include <string> 
#include <iostream> 
#include <fstream> 

void process_file() { 
    // Get file name. 
    std::string fileName; 
    std::cin >> fileName; 

    // Open file for read access. 
    std::ifstream input(fileName); 

    // Check if file exists. 
    if (!input) { 
     return EXIT_FAILURE; 
    } 

    // Get number of names. 
    int count = 0; 
    input >> count; 

    // Get names and print to cout. 
    std::string token; 
    for (int i = 0; i < count; ++i) { 
     input >> token; 
     std::cout << token; 
    } 
}