Чтение отформатированных данных с помощью оператора потока C ++ >>, когда в данных есть пробелы

Если вы добавили более чем аргумент ya в список Asp.Net MVC. Когда вы редактируете запись или передаете значение в сумке вида.

Используйте это, это будет работа: -

@Html.DropDownList("CurrencyID",null,String.Empty, new { @class = "form-control-mandatory" })
13
задан dreamlax 26 February 2010 в 00:57
поделиться

4 ответа

Вы можете прочитать число, прежде чем использовать std :: getline , который читает из потока и сохраняет в объект std :: string . Примерно так:

int num;
string str;

while(cin>>num){
    getline(cin,str);

}
10
ответ дан 1 December 2019 в 19:14
поделиться

Просто прочтите данные построчно (целая строка) с помощью getline и проанализируйте их.
Для синтаксического анализа используйте find_first_of ()

2
ответ дан 1 December 2019 в 19:14
поделиться

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

std::string number;
std::string name;

std::getline(infile, number, ':');
std::getline(infile, name);   

Это поместит данные до ':' в номер , отбросит ':' и прочитает остальную часть строки в имя .

Если вы хотите использовать >> для чтения данных, вы тоже можете это сделать, но это немного сложнее и углубляется в область стандартной библиотеки, которую большинство людей никогда не трогает. Поток имеет связанную локаль , которая используется для таких вещей, как форматирование чисел и (что важно) определение того, что составляет «пустое пространство». Вы можете определить свой собственный языковой стандарт, чтобы определить ":" как пробел, а пробел ("") как , а не как пробел. Скажите потоку использовать этот языковой стандарт, и он позволит вам напрямую читать ваши данные.

#include <locale>
#include <vector>

struct colonsep: std::ctype<char> {
    colonsep(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table() {
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::mask());

        rc[':'] = std::ctype_base::space;
        rc['\n'] = std::ctype_base::space;
        return &rc[0];
    }
};

Теперь, чтобы использовать его, мы «наполняем» поток локалью:

#include <fstream>
#include <iterator>
#include <algorithm>
#include <iostream>

typedef std::pair<int, std::string> data;

namespace std { 
    std::istream &operator>>(std::istream &is, data &d) { 
       return is >> d.first >> d.second;
    }
    std::ostream &operator<<(std::ostream &os, data const &d) { 
        return os << d.first << ":" << d.second;
    }
}

int main() {
    std::ifstream infile("testfile.txt");
    infile.imbue(std::locale(std::locale(), new colonsep));

    std::vector<data> d;

    std::copy(std::istream_iterator<data>(infile), 
              std::istream_iterator<data>(),
              std::back_inserter(d));

    // just for fun, sort the data to show we can manipulate it:
    std::sort(d.begin(), d.end());

    std::copy(d.begin(), d.end(), std::ostream_iterator<data>(std::cout, "\n"));
    return 0;
}

Теперь вы знаете , почему этой частью библиотеки так пренебрегают.Теоретически, получить стандартную библиотеку, которая будет выполнять вашу работу за вас, - это здорово, но на самом деле в большинстве случаев проще выполнить эту работу самостоятельно.

9
ответ дан 1 December 2019 в 19:14
поделиться
int i;
char *string = (char*)malloc(256*sizeof(char)); //since max is 255 chars, and +1 for '\0'
scanf("%d:%[^\n]s",&i, string); //use %255[^\n]s for accepting 255 chars max irrespective of input size
printf("%s\n", string);

Его C и будет работать и на C ++. scanf обеспечивает больший контроль, но не позволяет управлять ошибками. Так что используйте с осторожностью :).

2
ответ дан 1 December 2019 в 19:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: