@Steve Townsend đã chỉ ra một khả năng. Nếu bạn thích sử dụng operator>>
thay vì std::getline
, bạn cũng có thể làm điều đó. An istream
luôn xử lý khoảng trống làm dấu phân cách. Mỗi luồng có một ngôn ngữ được liên kết và mỗi miền địa phương bao gồm một khía cạnh ctype
. Điều đó ctype
khía cạnh là những gì các istream
sử dụng để xác định những ký tự đầu vào là khoảng trắng. Trong trường hợp của bạn, có vẻ như bạn muốn luồng chỉ xử lý các dòng mới và dấu hai chấm là "khoảng trắng", nghĩa là ký tự khoảng trắng được coi là ký tự "bình thường" chứ không phải dấu phân cách.
Để làm điều đó, bạn có thể tạo ra một khía cạnh CType như thế này:
struct field_reader: std::ctype<char> {
field_reader(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table() {
static std::vector<std::ctype_base::mask>
rc(table_size, std::ctype_base::mask());
rc['\n'] = std::ctype_base::space;
rc[':'] = std::ctype_base::space;
return &rc[0];
}
};
Để sử dụng, điều này, bạn phải "thấm nhuần" dòng với ngôn ngữ sử dụng khía cạnh này:
int main() {
std::stringstream input("A:KT5:14:executive desk:");
// have the stream use our ctype facet:
input.imbue(std::locale(std::locale(), new field_reader()));
// copy fields from the stream to standard output, one per line:
std::copy(std::istream_iterator<std::string>(input),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
Tôi là người đầu tiên thừa nhận, tuy nhiên, điều này có một số thiếu sót. Trước hết, ngôn ngữ và khía cạnh thường khá kém tài liệu, do đó, nhất Trình lập trình C++ có khả năng tìm thấy điều này khá khó hiểu (đặc biệt là khi tất cả các công việc thực sự xảy ra "dưới bìa", để nói).
Một khả năng khác là sử dụng Boost Tokenizer. Nói chung, đây là một chút hơn hoạt động để sử dụng - nó sẽ yêu cầu bạn làm điều gì đó như đọc chuỗi, sau đó chia nhỏ riêng biệt.Đồng thời, nó được viết thành văn bản, khá phổ biến và phù hợp hơn với các định kiến của mọi người về cách làm những việc như thế, rằng có rất ít người có thể dễ dàng theo dõi hơn bất chấp sự phức tạp thêm.
Chà ... và không phải là một cách tốt. Tôi nghĩ rằng tôi sẽ dính vào C. – onemasse
cảm ơn Steve !!! – rajh2504
@onemasse, erm: tuyên bố thực sự trông giống như: "istream & getline (istream & is, string & str, char delim);', không quá tệ bây giờ là nó? :), không phải đề cập đến những gì 'std :: getline' cung cấp cho bạn hơn C tương đương! :) – Nim