cuốn sách gpt4 ai đã làm

c++ - Đọc bằng setw : sang eof hay không vào eof?

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 18:39:04 27 4
mua khóa gpt4 Nike

Hãy xem xét ví dụ đơn giản sau

#include 
#include
#include

using namespace std;

int chính() {
chuỗi str = "chuỗi";
istringstream là(str);
là >> setw(6) >> str;
trả về is.eof();
}

Thoạt nhìn, vì chiều rộng rõ ràng được cho bởi đã định sẵn người thao túng chỉ định rằng tôi muốn >>> Toán tử hoàn tất việc đọc chuỗi theo số lượng ký tự được yêu cầu từ luồng đầu vào sau khi trích xuất chuỗi thành công. Tôi không thấy bất kỳ lý do trực tiếp nào để cố gắng trích xuất ký tự thứ bảy, điều đó có nghĩa là tôi không muốn luồng đi vào ôi tình trạng.

Khi tôi chạy ví dụ này trong MSVC++, nó hoạt động như tôi mong đợi: luồng vẫn ổn sau khi đọc. Tuy nhiên, trong GCC hoạt động lại khác: luồng bắt đầu bằng ôi Nhà nước kết thúc.

tiêu chuẩn ngôn ngữ được sử dụng cho phiên bản này >>> toán tử đưa ra danh sách các điều kiện hoàn thành sau đây

  • n ký tự được lưu trữ;
  • phần cuối của tập tin xảy ra trên chuỗi đầu vào;
  • isspace(c,is.getloc()) đúng với ký tự đầu vào có sẵn tiếp theo c.

Theo quan điểm trên, tôi thấy không có lý do tại sao >>> toán tử trong đoạn mã trên điều khiển luồng tới ôi tình trạng.

Nhưng đây là >> toán tử triển khai trong thư viện GCC看起来像

...
__int_type __c = __in.rdbuf()->sgetc();

trong khi (__ đã trích xuất < __n
&& !_Traits::eq_int_type(__c, __eof)
&& !__ct.is(__ctype_base::space,
_Traits::to_char_type(__c)))
{
if (__len == sizeof(__buf) / sizeof(_CharT))
{
__str.append(__buf, sizeof(__buf) / sizeof(_CharT));
__len = 0;
}
__buf[__len++] = _Traits::to_char_type(__c);
++__ được trích xuất;
__c = __in.rdbuf()->snextc();
}
__str.append(__buf, __len);

if (_Traits::eq_int_type(__c, __eof))
__err |= __ios_base::eofbit;
__in.width(0);
...

Như bạn có thể thấy, vào cuối mỗi lần lặp thành công, nó sẽ cố gắng chuẩn bị lần lặp tiếp theo cho lần lặp tiếp theo. __c ký tự, mặc dù lần lặp tiếp theo có thể không bao giờ xảy ra. Sau khi vòng lặp kết thúc, nó phân tích __c giá trị cuối cùng của ký tự và đặt tương ứng eofbit.

Vì vậy, câu hỏi của tôi là: kích hoạt trong tình huống trên ôi Trạng thái phát trực tuyến, giống như GCC - nó có hợp pháp từ góc độ tiêu chuẩn không? Tôi không thấy nó được chỉ định rõ ràng trong tài liệu. MSVC và GCC có hoạt động tuân thủ không? Hay chỉ một trong số họ cư xử đúng?

câu trả lời hay nhất

điều đặc biệt đó nhà điều hành>> định nghĩa và eofbit Cài đặt không liên quan vì nó chỉ mô tả khi hoạt động kết thúc chứ không mô tả lý do tại sao một bit cụ thể được kích hoạt.

eofbit Mô tả trong tiêu chuẩn (dự thảo) cho biết:

eofbit - chỉ ra rằng thao tác đầu vào đã đạt đến cuối chuỗi đầu vào;

Tôi đoán nó phụ thuộc vào cách bạn muốn diễn giải "tầm với". Lưu ý rằng việc triển khai gcc chính xác không được đặt lỗi , được định nghĩa là

Failbit - chỉ ra rằng thao tác đầu vào không đọc được các ký tự mong muốn hoặc thao tác đầu ra không tạo được các ký tự mong muốn.

vì vậy tôi nghĩeofbitĐiều đó không nhất thiết có nghĩa là phần cuối của tệp đang chặn việc trích xuất bất kỳ ký tự mới nào, chỉ là phần cuối của tệp đã được "đạt tới".

Tôi dường như không thể tìm thấy mô tả chính xác hơn về "phạm vi tiếp cận", vì vậy tôi đoán đây sẽ là việc triển khai được xác định. Nếu logic này đúng thì cả MSVC và gcc đều hoạt động chính xác.


EDIT: Đặc biệt, có vẻ như eofbithiện hữu sgetc() cài đặt sẽ trở lại ôi .đây là istreambuf_iterator được mô tả trong . tổng một phần basic_istream::sentryphần. Vì vậy, bây giờ câu hỏi là: khi nào vị trí hiện tại của luồng được phép tiến lên?


Chỉnh sửa cuối cùng: Hóa ra có lẽ g++ có hành vi đúng.

Mỗi lần quét ký tự đều trải qua , để cho phép phân tích các bộ ký tự, định dạng tiền tệ, mô tả thời gian và định dạng số khác nhau. Mặc dù dường như không có thông tin gì về nhà điều hành>> mô tả đầy đủ. Hoạt động với chuỗi, về cách sử dụng do_get Có những mô tả rất cụ thể về cách hoạt động của các hàm số, thời gian và tiền tệ. Bạn có thể tìm thấy chúng ở trang 687 của bản thảo trước đó.

Tất cả điều này đến từ việc đọc ctype Phiên bản bắt đầu ("toàn cầu" của ký tự, được đọc qua ngôn ngữ) đến từ istreambuf_iterator (Đối với số, bạn có thể tìm định nghĩa cuộc gọi ở trang 1018 của bản nháp). Sau đó, ctype được xử lý và cuối cùng là iterator được nâng cao.

Vì vậy, nói chung, điều này yêu cầu trình vòng lặp nội bộ luôn trỏ đến ký tự tiếp theo sau lần đọc cuối cùng;

chuỗi str = "strin1";
istringstream là(str);
là >> setw(6) >> str;
int x;
là >> x;

Nếu ký tự hiện tại làSau khi khai thác strKhông phải ở đây ôi , thì tiêu chuẩn sẽ yêu cầu xCó giá trị 1 vì để trích xuất số, tiêu chuẩn yêu cầu rõ ràng trình lặp phải tiến lên sau lần đọc đầu tiên.

Vì điều này không có nhiều ý nghĩa và do tất cả các trích xuất phức tạp được mô tả trong tiêu chuẩn đều hoạt động theo cùng một cách, nên điều tương tự cũng sẽ xảy ra đối với các chuỗi. Vì vậy, như Con trỏ rơi xuống sau khi đọc 6 ký tự ôi , eofbitYêu cầu thiết lập.

Về c++ - đọc bằng setw : to eof hay không to eof?, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/26472237/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress