[英]Why this fscanf() segfaults when a big file is used?
我有一個函數來接收文件名作為參數。 想法是讀取給定文件中的每個單詞,並將每個單詞保存在鏈接列表中(作為帶有值的結構和指向下一個結構的指針)。 我可以使它適用於小文件,但是當我提供大的.txt文件時,會出現分段錯誤。 使用gdb,我可以發現這發生在while(fscanf(fi, "%s", value) != EOF){
行。 由於某種原因,當文件較大時,fscanf()段會出現錯誤。 正如我可以找出鏈表的一部分一樣,在這里我粘貼了足夠的代碼進行編譯,以供您查看我的問題。
所以我的問題是:為什么fscanf()segfauts使用大.txt文件(成千上萬個單詞),而不使用小文件(十個單詞)?
順便說一句,有沒有更好的方法來檢查文件的結尾?
提前致謝。
bool read(const char* file){
// open file
FILE* fi = fopen(file, "r"); //file is a variable that contains the name of the file to be opened
if (fi == NULL)
{
return false;
}
// malloc for value
char* value = malloc(sizeof(int));
// fscanf() until the end of the file
while(fscanf(fi, "%s", value) != EOF){ // HERE IS MY PROBLEM
// some code for the linked list
// where the value will be saved at the linked list
}
// free space
free(value);
// close the file
fclose(fi);
return true;
}
不,這是您的問題:
char* value = malloc(sizeof(int)); // <<<<<<< You allocate only place for an int
while(fscanf(fi, "%s", value) != EOF){ // <<<<<<< but you read a huge string
因此,您最終會遇到緩沖區溢出!
您必須通過設置一些限制來確保您不會溢出緩沖區的大小。 例如,通過使用fscanf()的width字段指示要讀取的字符串最大字符數:
char* value = malloc(512); // Allocate your buffer
while(fscanf(fi, "%511s", value) != EOF){ // read max 511 chars + 1 char for terminating 0
...
(免責聲明:簡化說明)
char*
是指向內存地址的指針。 它指定它指向字符數組。 malloc
調用保留一定大小的內存塊。
你的線
char* value = malloc(sizeof(int));
創建一個可以容納4個字符的字符數組(因為int通常為4個字節長)。 為了使它成為完整的字符串,最后一個字符必須為NULL終止符'\\ 0',因此實際上它只能容納3個可讀字符。
您應該使malloc創建一個大於文件中最大字符串的內存塊。 或者,您可以使用其他更安全的方法,例如fgets
: http : //www.cplusplus.com/reference/cstdio/fgets/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.