2013-03-12 3 views
2

Я использую STL. Мне нужно прочитать строки из текстового файла. Как читать строки до первого \n, но не до первого ' ' (пробел)?Как читать целые строки из файла (с пробелами)?

Например, мой текстовый файл содержит:

Hello world 
Hey there 

Если я пишу так:

ifstream file("FileWithGreetings.txt"); 
string str(""); 
file >> str; 

тогда str будет содержать только "Hello", но мне нужно "Привет мир" (пока сначала \n).

Я думал, что могу использовать метод getline(), но он требует указать количество символов для чтения. В моем случае я не знаю, сколько символов я должен прочитать.

+1

Использование [другой, гораздо лучше, 'getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline). – jrok

+0

@jrok Спасибо, теперь я использую именно 'getline()'. – Vladimir

ответ

8

Вы можете использовать GetLine:

#include <string> 
#include <iostream> 

int main() { 
    std::string line; 
    if (getline(std::cin,line)) { 
     // line is the whole line 
    } 
} 
+0

Спасибо! Это решило мою проблему. В новом комментарии я покажу свой новый код. – Vladimir

2

с использованием getline функции является одним из вариантов.

или

getc читать каждый символ с петлей сделай в то время как

, если файл состоит из чисел, это было бы лучше, чтобы читать.

do { 
    int item=0, pos=0; 
    c = getc(in); 
    while((c >= '0') && (c <= '9')) { 
     item *=10; 
     item += int(c)-int('0'); 
     c = getc(in); 
     pos++; 
    } 
    if(pos) list.push_back(item); 
    }while(c != '\n' && !feof(in)); 

попытаться изменяя этот метод, если файл состоит из струн ..

+1

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

1

я предлагаю:

#include<fstream> 

ifstream reader([filename], [ifstream::in or std::ios_base::in); 

if(ifstream){ // confirm stream is in a good state 
    while(!reader.eof()){ 
    reader.read(std::string, size_t how_long?); 
    // Then process the std::string as described below 
    } 
} 

Для станд :: строка, любое имя переменной будет делать, и как долго, независимо от того, что вы считаете нужным, или используйте std :: getline, как указано выше.

Для обработки строки, просто использовать итератор на станд :: строка:

std::string::iterator begin() & std::string::iterator end() 

и обработать символ указателя итератор символ до тех пор, пока у вас есть \ п и «» вы ищете.

0

Спасибо всем, кто ответил мне. Я сделал новый код для моей программы, которая работает:

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

using namespace std; 

int main(int argc, char** argv) 
{ 
    ifstream ifile(argv[1]); 

    // ... 

    while (!ifile.eof()) 
    { 
     string line(""); 
     if (getline(ifile, line)) 
     { 
      // the line is a whole line 
     } 

     // ... 
    } 

    ifile.close(); 

    return 0; 
} 
+0

1. Лучше указать условие так же, как 'while (ifile)', так как 'ifstream' перегрузил' operator bool() 'проверить, нормально ли это или нет. 2. Не закрывайте 'ifile' явно. Это делается неявно в деструкторе 'ifstream' в соответствии с принципом RAII. – Mikhail

+0

3. Не указывайте значение "" для 'std :: string' - оно просто избыточно, строка инициализируется с помощью" "в конструкторе по умолчанию. 4. Здесь у вас два теста: в 'while' и в' if', а на одном достаточно, то есть 'getline'. Переместите его в состояние 'while', и вам не нужно будет вообще проверять' ifile'. – Mikhail

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