簡體   English   中英

為什么在使用大文件時此fscanf()出現段錯誤?

[英]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創建一個大於文件中最大字符串的內存塊。 或者,您可以使用其他更安全的方法,例如fgetshttp : //www.cplusplus.com/reference/cstdio/fgets/

暫無
暫無

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

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