名稱空間
變體
操作

std::fgets

來自 cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
定義於標頭檔案 <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