[英]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字符串。
你的選擇是:
不添加終結符,但跟蹤大小 - 您可以使用C ++ 17
std::string_view bufstr(buffer, nchars);
保持指針和大小在一起(你可以正常打印)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.