2014-01-24 3 views
6

Как я могу прочитать данные недо конца строки У меня есть текстовый файл «file.txt» с этимЧтение из файла в C++ до конца строки?

1 5 9 2 59 4 6 
2 1 2 
3 2 30 1 55 

У меня есть этот код:

ifstream file("file.txt",ios::in); 
while(!file.eof()) 
{ 
    ....//my functions(1) 
    while(?????)//Here i want to write :while (!end of file) 
    { 
     ...//my functions(2) 
    } 

} 

в мои функции (2) я используйте данные из линий, и это должно быть Int, а не char

+0

Зачем вам нужно читать до конца строки? И по «концу строки» вы имеете в виду конец строки * first * или конец всех строк? – 0x499602D2

+0

«конец строки», я имею в виду прочесть первую строку, использовать числа, чтобы сделать то, что мне нужно, и перейти во вторую строку ..., затем на третьей строке до конца файла – user3050163

+0

Выполняете ли вы то же самое операции на каждой строке? – 0x499602D2

ответ

2

Что касается чтения до конца строки. есть std::getline.

У вас есть еще одна проблема, и это то, что вы петли while (!file.eof()), который, скорее всего, не будет работать так, как вы ожидаете. Причина в том, что флаг eofbit не установлен до после, который вы пытаетесь прочитать из-за конца файла. Вместо этого вы должны сделать это, например. while (std::getline(...)).

+0

getline работа с char only – user3050163

+0

@ user3050163 Чтение в 'std :: string', помещаемое в цикл' std :: istringstream', используя оператор ввода '>>', чтобы получить каждое значение с разделителем пробела. –

+0

@ user3050163 Или после того, как вы прочтете строку и поместите ее в ['std :: istringstream'] (http://en.cppreference.com/w/cpp/io/basic_istringstream), используйте [' std :: copy' ] (http://en.cppreference.com/w/cpp/algorithm/copy) с помощью ['std :: istream_iterator'] (http://en.cppreference.com/w/cpp/iterator/istream_iterator), чтобы поставить значения непосредственно в [контейнер] (http://en.cppreference.com/w/cpp/container) с помощью ['std :: back_inserter'] (http://en.cppreference.com/w/cpp/iterator/back_inserter). –

4

Не используйте while(!file.eof()), так как eof() будет установлен после считывания конца файла. Он не указывает, что следующим считанным будет конец файла. Вы можете использовать while(getline(...)) вместо этого и объединить с istringstream для чтения чисел.

#include <fstream> 
#include <sstream> 
using namespace std; 

// ... ... 
ifstream file("file.txt",ios::in); 
if (file.good()) 
{ 
    string str; 
    while(getline(file, str)) 
    { 
     istringstream ss(str); 
     int num; 
     while(ss >> num) 
     { 
      // ... you now get a number ... 
     } 
    } 
} 

Вам необходимо прочитать Why is iostream::eof inside a loop condition considered wrong?.

+0

если я использую getline, мне нужно преобразовать из int в char, но мне нужны данные, чтобы быть int !!!! – user3050163

+0

@ user3050163 Обновлено. – herohuyongtao

+0

(getline (file, str)) не работает ошибка: can; t конвертировать из istream в char – user3050163

1
char eoln(fstream &stream)   // C++ code Return End of Line 
{ 
    if (stream.eof()) return 1;  // True end of file 
    long curpos; char ch; 
    curpos = stream.tellp();  // Get current position 
    stream.get(ch);     // Get next char 
    stream.clear();     // Fix bug in VC 6.0 
    stream.seekp(curpos);   // Return to prev position 
    if ((int)ch != 10)    // if (ch) eq 10 
     return 0;     // False not end of row (line) 
    else       // (if have spaces?) 
     stream.get(ch);    // Go to next row 
    return 1;      // True end of row (line) 
}         // End function 
0

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

vector<unsigned long long> Hash_file_read(){ 
    int frames_sec = 25; 
    vector<unsigned long long> numbers; 
    ifstream my_file("E:\\Sanduni_projects\\testing\\Hash_file.txt", std::ifstream::binary); 
    if (my_file) { 

     //ifstream file; 
     string line; 

     for (int i = 0; i < frames_sec; i++){ 
      getline(my_file, line); 
      numbers.push_back(stoull(line)); 
     } 

    } 
    else{ 
     cout << "File can not be opened" << endl; 
    } 
    return numbers; 
} 
Смежные вопросы