0

複数行のテキストファイルがあります。お気に入り:

11111111
22222222
33333333
44444444
55555555
...

各行を取得するために AC コードを書きました。私のコードはすべての行を解析し、それらを出力コンソールに正常に書き込みました。しかし、最後の回線アプリがクラッシュした後。戻る

Program received signal SIGSEGV, Segmentation fault. 

何故ですか?

私のCコード:

FILE *fPtr;
char file[]="/root/dd";

char *rest;
char *token;
char *buffer;

unsigned long size;

fPtr = fopen(file,"r"); 

fseek(fPtr, 0, SEEK_END);
size=(unsigned long)ftell(fPtr);
fseek(fPtr, 0, SEEK_SET);

buffer=(char *)malloc(size);    

if(fPtr)
{   
    while(fgets(buffer, size, fPtr))    
    {
        while(token = strtok_r(buffer, "\n", &rest))
        {
            printf("token: %s\n", token);
            buffer = rest;
        }
    }
    fclose(fPtr);
}
else
{
     printf("file not open \n");
}

アップデート

問題は strtok_r() とは関係ないと思います。コードを変更したため:

FILE *fPtr;
char file[]="/root/dd";

char *rest;
char *token;
char *buffer;

unsigned long size;

fPtr = fopen(file,"r");

if(fPtr==NULL)
{
     printf("null pointer\n");
}

fseek(fPtr, 0, SEEK_END);
size=(unsigned long)ftell(fPtr);
fseek(fPtr, 0, SEEK_SET);

buffer=(char *)malloc(size);    

if(fPtr)
{   
    while(fgets(buffer, size, fPtr))    
    {
         printf("buffer: %s\n", buffer);
    }
    fclose(fPtr);
}
else
{
     printf("file not open \n");
}

それでも同じことが起こります。

4

3 に答える 3

0

の 2 回目以降の呼び出しでstrtok_rは、最初のパラメーターを として持つ必要がありますNULL。ただし、これがセグメンテーション違反の理由かどうかはわかりません。

また、行のどこbufferを指すかを変更しています

buffer = rest;

ファイル全体を読み取ってfgets行を終了すると、再度実行され、buffersize のメモリ ブロックを指しなくなりますsize。これがあなたのセグメンテーション違反を引き起こしていると思われます。

また、変更することによって、以前のメモリを ing するbuffer方法がありません。freemalloc

于 2013-10-08T14:32:21.290 に答える