簡體   English   中英

對於大小為 20 的 char[],如果我將 char 從 char[0] 輸入到 char[7],然后將 char[] 寫入文件,它會占用磁盤上的 20 個字節還是 8 個字節?

[英]For a char[] of size 20, if i enter char from char[0] to char[7], and i write the char[] to a file, does it take up 20 bytes or 8 bytes on the disk?

這是一個示例代碼

char text[20];
fstream file("temp.dat",ios::binary|ios::in|ios::out|ios::app);
cout<<"Enter the text: "<<endl;
cin>>text; //assuming text entered is elephant

// file write operation
file.write((char*)(&text),sizeof(text));
// file write operation done

因此,如果大小為 20 的 char 數組存儲 8 個字符長的單詞“elephant”(char[0] 到 char[7]),則存儲在 char[] 的 rest 中的內容從 char[8] 開始到字符[19]? 此文本在磁盤上占用 8 個字節還是因為 char[] 大小為 20 個字節而在磁盤上占用 20 個字節?

"elephant"(char[0] to char[7]),長度為 8 個字符

當一個人記得計算 null 終止符時,“大象”實際上是 9 個字符。

從 char[8] 到 char[19] 的 char[] 的 rest 中存儲了什么?

它們不會被 stream 提取操作修改。 如果它們之前沒有被初始化,那么它們將保持未初始化狀態,即它們將具有不確定的值。

該文本是在磁盤上占用 8 個字節還是在磁盤上占用 20 個字節,因為 char[] 的大小為 20 個字節?

write 的第二個參數是您寫入的字符數。 你傳遞了sizeof(text)即 20,因此你寫了 20 個字符。

這就是文件的大小。 占用磁盤多少空間取決於文件系統。

由於您使用 sizeof,因此它需要所有數組,其中沒有文本的地方是 \0。 您可以使用strlen來限制刺痛的長度。

然而,所有這些類似 C 的方法都是不好的。 大量溢出、運行不足、序列化問題等。請改用std::string 在 Windows 中,您還需要 Unicode 文本。

如果大小為 20 的 char 數組存儲了 8 個字符長的單詞 "elephant"(char[0] to char[7])

9 實際上,如果您計算char[8]處的 null 終止符。

從 char[8] 到 char[19] 的 char[] 的 rest 中存儲了什么?

該內容是不確定的,因為您在讀入數組之前沒有使用任何數據初始化數組,並且讀取小於數組大小的單詞不會填充數組的未使用部分。

此外,您在讀取時沒有指定數組的大小,因此您有潛在的緩沖區溢出等待發生。 想象一下,如果用戶輸入一個長度超過 20 個字符的單詞會發生什么。 cin不知道何時停止讀取,因此它會將緩沖區溢出到周圍的 memory。 因此,您應該改用cinget()方法:

cin.get(text, sizeof(text));

或者,如果您希望文本允許空格, getline()方法:

cin.getline(text, sizeof(text));

get() / getline()確保讀取不超過緩沖區,並且 output 以空值結尾(如果需要,截斷文本)。 cin.gcount()將告訴您實際讀取了多少個字符。

或者更好的是,使用std::string代替:

string text;
cin >> text; // or: getline(cin, text);

這將確保讀取完整的單詞(或行),無論其長度如何。

此文本在磁盤上占用 8 個字節還是因為 char[] 大小為 20 個字節而在磁盤上占用 20 個字節?

20 個字節將被寫入文件1 ,因為這是您告訴write()寫入的字節數( sizeof(text) ),無論數組的實際內容如何。

1:文件在磁盤上占用的實際字節數取決於多種因素:正在使用的特定文件系統,文件是稀疏的還是壓縮的,等等。但是讓我們假設一個沒有稀疏/壓縮的簡單文件系統。 無論您寫入多少字節,該文件都會占用磁盤集群大小的偶數倍,加上跟蹤有關文件的元數據的開銷。

如果您只想寫入已讀取文本的末尾,而不是數組的末尾,那么您將需要更像這樣的東西:

char text[20] = {};
fstream file("temp.dat", ios::binary|ios::in|ios::out|ios::app);
cout << "Enter the text: " << endl;
cin.get(text, sizeof(text)); // or: cin.getline(text, sizeof(text));

// file write operation
file.write(text, cin.gcount()/*or: strlen(text)*/);
// file write operation done

或更好:

string text;
fstream file("temp.dat", ios::binary|ios::in|ios::out|ios::app);
cout << "Enter the text: " << endl;
cin >> text; // or: getline(cin, text);

// file write operation
file << text; // or: file.write(text.c_str(), text.size());
// file write operation done

暫無
暫無

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

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