Чтение постоянного числа символов в C ++ - PullRequest
0 голосов
/ 06 октября 2011

Как бы вы прочитали строку, если она не длиннее 20 символов и может содержать пробелы в C ++? Например, у меня есть такой файл:

3
Namama               4 5 12
Cool                 4 2 34
Not So Cool          4 2 45

Я хочу написать это самым простым способом. И я бы предпочел использовать только C ++ (без C-штуковин) в этом случае. Это означает, что я хочу сохранить его в std :: string.

Я мог бы использовать istream :: get или istream :: getline , но тогда я должен избегать символов новой строки. Это проблематично (и код, который я пишу, будет показан новичкам).

Как вы решаете эту проблему?

Edit:

Как меня спросили, я собираюсь рассказать вам, что я пытался, но я не думаю, что это будет хорошо. Я не новичок в C ++, и обычно я бы использовал что-то вроде istream :: get и массив символов, но для некоторых людей удаление символов новой строки может показаться слишком сложным.

Итак ... Либо чтение массива символов, либо std :: string с использованием istream :: operator >> завершается неудачно, потому что прекращается чтение, когда они видят пробел (и я могу читать несколько слов). Это означает, что следующий код не работает:

char name[21];
std::cin >> name;

или ...

std::string name;
std::cin >> name;

Другое дело, что символы новой строки отличаются от системы к системе, и фактически Windows использует два из них по умолчанию, и я попытался использовать istream :: ignore с 2 в качестве аргумента в Windows, и это было Единственный способ игнорировать новую строку, и я пришел к выводу, что это потому, что Windows использует два символа для знака новой строки. Это означает, что он не будет работать в Linux и должен быть более сложным ... Опять же - плохо для начинающих.

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Если вы хотите прочитать в точности 20 символов,

for(int i=0; i<3; ++i) {
    std::string result;
    int one, two, three;

    result.resize(20);
    if (!std::cin.read(&result[0], 20)) throw std::runtime_error("reading buffer failed!");

    if (!std::cin >> one >> two >> three) throw std::runtime_error("reading numbers failed!");
    if (!std::cin.ignore(1000, '\n')) throw std::runtime_error("ignore failed!");
}

Если вам не нужны ровно 20 символов, как вы узнаете, когда достигли конца строки?

0 голосов
/ 06 октября 2011

Один из способов сделать это - использовать istream :: read во временный буфер достаточного размера, а затем использовать этот буфер для инициализации std :: string.

char name[21];
std::cin.read(name, 20);
std::string nameString(name); // If you want it in a std::string

Это читает ровно 20символы, переводы строк и все.Если это для упражнения, то это как минимум очень просто.Если вам иногда требуется менее 20 символов, можно определить, сколько дополнительных считываний было прочитано, и вернуть указатель получения по std :: istream :: unget или эквивалентному ему.

...