2015-10-10 47 views
0

該程序的總體目標是從文件讀取數據(float或letter),並使用互斥鎖更改我的全局常量。 (直到現在我還沒有應用)C:多個pthread中的fgets錯誤

但是在我能做到這些之前,我只是想創建一個基本程序來讀取文件的全部內容並打印到屏幕上。 目前,我的程序無法做到這一點。它只是讀取文件的第一個字符並退出文件。
我正在提供我的代碼,也是錯誤。任何援助都會非常有幫助。

#include <stdio.h> 
#include <pthread.h> 
#include <string.h> 

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
char *files[] = {"one.in", "two.in", "three.in", "four.in", "five.in"}; 

void* thread(void * arg) 
{ 
    char * file = (char *) arg; 
    // open the file and read the content 
    FILE *fp = fopen(file,"r"); 
    char line[1024]; 
    int len; 

    printf("Thread id is %s enter\n",file); 
    if(!fp) 
    { 
     printf("%s file open failed\n", file); 
     return 0; 
    } 
    else 
     printf("%s File open success %p %d\n", file, fp, ftell(fp)); 
    // dump the file content with thread id (file name) 
    while (fgets(line,len, fp)) 
    { 
     printf("%s %s", file, line); 
    } 
    printf("Thread id is %s %d exit\n",file, ftell(fp)); 
    fclose(fp); 
    return 0; 
} 

int main(void) 
{ 
    int i = 0; 

    if (pthread_mutex_init(&mutex, NULL) != 0) 
    { 
     printf("\n mutex init failed\n"); 
     return 1; 
    } 
    for(i = 4; i >= 0; i--) 
    { 
     pthread_t id; 
     pthread_create(&id, NULL, &thread, files[i]); 
     pthread_detach(id); 
    } 
    printf("Main thread exit\n"); 
    pthread_exit(0); 
    printf("Main thread real exit\n"); 
    return 0; 
} 

錯誤

Thread id is five.in enter 
five.in File open success 0x7fff7a2e7070 0 
Thread id is five.in 0 exit 
Thread id is four.in enter 
four.in File open success 0x7fff7a2e7070 0 
Thread id is four.in 0 exit 
Thread id is three.in enter 
three.in File open success 0x7fff7a2e7070 0 
Thread id is three.in 0 exit 
Thread id is two.in enter 
two.in File open success 0x7fff7a2e7070 0 
Thread id is two.in 0 exit 
Thread id is one.in enter 
one.in File open success 0x7fff7a2e7070 0 
Thread id is one.in 0 exit 
Main thread exit 

文件格式

R 
1 
2 
3 
-4 
-5 
4 
W 

回答

1

的問題是調用fgets()

while (fgets(line,len, fp)) 

len未初始化。 Thi技術上是undefined behaviour

你想要的是使用的line大小:

while (fgets(line, sizeof line, fp))