std::fgets
來自 cppreference.com
定義於標頭檔案 <cstdio> |
||
char* fgets( char* str, int count, std::FILE* stream ); |
||
從給定的檔案流中讀取最多 count - 1 個字元,並將它們儲存在 str 指向的字元陣列中。如果找到換行符,解析將停止,在這種情況下,str 將包含該換行符;或者如果遇到檔案結束。如果讀取了位元組且未發生錯誤,則在寫入 str 的最後一個字元後的位置寫入一個空字元。
目錄 |
[編輯] 引數
str | - | 指向字元陣列元素的指標 |
count | - | 要寫入的最大字元數(通常是 str 的長度) |
stream | - | 從中讀取資料的檔案流 |
[編輯] 返回值
成功時返回 str,失敗時返回空指標。
如果遇到檔案結束條件,則設定 stream 上的 eof 指示符(參見 std::feof())。僅當它導致沒有位元組被讀取時才視為失敗,在這種情況下,返回空指標,並且 str 指向的陣列內容不被修改(即,第一個位元組不會被空字元覆蓋)。
如果失敗是由其他錯誤引起的,則設定 stream 上的 error 指示符(參見 std::ferror())。str 指向的陣列內容是不確定的(它甚至可能沒有以空字元結尾)。
[編輯] 注意
POSIX 額外要求如果 fgets
遇到非檔案結束條件的失敗,則設定 errno。
儘管在 count <= 1 的情況下,標準規範不明確,但常見實現會:
- 如果 count < 1,不執行任何操作,報告錯誤。
- 如果 count == 1,
- 有些實現不執行任何操作,報告錯誤。
- 其他實現不讀取任何內容,將零儲存在 str[0] 中,報告成功。
[編輯] 示例
執行此程式碼
#include <cstdio> #include <cstdlib> #include <iomanip> #include <iostream> #include <span> void dump(std::span<const char> buf, std::size_t offset) { std::cout << std::dec; for (char ch : buf) std::cout << (ch >= ' ' ? ch : '.'), offset--; std::cout << std::string(offset, ' ') << std::hex << std::setfill('0') << std::uppercase; for (unsigned ch : buf) std::cout << std::setw(2) << ch << ' '; std::cout << std::dec << '\n'; } int main() { std::FILE* tmpf = std::tmpfile(); std::fputs("Alan Turing\n", tmpf); std::fputs("John von Neumann\n", tmpf); std::fputs("Alonzo Church\n", tmpf); std::rewind(tmpf); for (char buf[8]; std::fgets(buf, sizeof buf, tmpf) != nullptr;) dump(buf, 10); }
輸出
Alan Tu. 41 6C 61 6E 20 54 75 00 ring..u. 72 69 6E 67 0A 00 75 00 John vo. 4A 6F 68 6E 20 76 6F 00 n Neuma. 6E 20 4E 65 75 6D 61 00 nn..uma. 6E 6E 0A 00 75 6D 61 00 Alonzo . 41 6C 6F 6E 7A 6F 20 00 Church.. 43 68 75 72 63 68 0A 00
[編輯] 另請參閱
從 stdin、檔案流或緩衝區讀取格式化輸入 (函式) | |
(C++11 起已棄用)(C++14 起移除) |
從 stdin 讀取一個字串 (函式) |
將字元字串寫入檔案流 (函式) | |
C 文件,關於 fgets
|