簡體   English   中英

緩沖區填充char數組中的最后一個空格和不需要的數據

[英]Buffer filling last empty spaces in char array with unwanted data

FILE* file_;
        char buffer[5];
                file_ = fopen("Data.txt", "a+");
        while (!feof(file_)) 
        {
            fread(buffer, sizeof(buffer), 1, file_);
            cout << buffer<<" ";
            BM(buffer, pat);
        }

DATA.TXT = “ABCC1ABCC2XXX”

輸出:

ABCC1m

ABCC2m

XXX C2 m

如何在開始從前一個緩沖區生成字符之前使緩沖區停止?(粗體字體部分)

通緝輸出:

ABCC1

ABCC2

XXX

你有兩個問題。 首先,你根本不是空終止buffer (這就是你得到m輸出的原因。其次,當你有一個簡短的讀取時,你不是在正確位置的空終止buffer

fread會告訴你它讀了多少個字符,你需要把'\\0'放在那里。 編輯前面的描述不准確。 它告訴你它讀取了多少個對象 ,每個對象的大小為arg2,並且你讀到了它們的arg3。 您需要將參數更改為fread以便您正在讀取單個字符,以及緩沖區中的空間。 所以:

        FILE* file_;
        char buffer[5+1];
                file_ = fopen("Data.txt", "a+");
        while (!feof(file_)) 
        {
            const size_t nchars = fread(buffer, 1, sizeof(buffer)-1, file_);
            buffer[nchars] = '\0';
            cout << buffer<<" ";
            BM(buffer, pat);
        }

迂腐:如果緩沖區不是char / signed char / unsigned char ,那么fread的第二個參數也可以寫成sizeof(buffer[0]) - 但這三個被定義為sizeof 1。

好吧,我找不到合適的副本 - 也許其他人會。

這條線

fread(buffer, sizeof(buffer), 1, file_);

可能會完全填滿你的緩沖區。 您需要保持返回值以了解實際寫入了多少字節,但假設您的文件至少包含五個字節,則buffer數組的所有五個字節現在都已初始化。

但是,要將buffer打印為常規C字符串,它需要第六個字節,包含空終止符。

例如,C字符串"12345"實際上表示為char數組{'1', '2', '3', '4', '5', 0}

緩沖區中沒有空間用於終止符,也沒有寫入終結符,因此不能將其視為簡單的C字符串。

你的選擇是:

  1. 手動添加終結器,如Martin Bonner的回答
  2. 不添加終結符,但跟蹤大小 - 您可以使用C ++ 17

     std::string_view bufstr(buffer, nchars); 

    保持指針和大小在一起(你可以正常打印)

  3. 完全停止使用舊的CI / O庫。 事實上,C ++ I / O庫沒有更好的方法來讀取五個字符的組,但是例如,讀取整行更容易正確地執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM