2015-10-10 2 views
0

Моя общая цель программы - считывать данные (float или letter) из файла и изменять мою глобальную константу с помощью мьютекса. (Я не применял его до сих пор)C: ошибка fgets в течение нескольких pthread

Но прежде чем я смог это сделать, я просто подумал о создании базовой программы для чтения всего содержимого файла и печати на экране. В настоящее время моя программа не может этого сделать. Он просто считывает первый символ файла и выходит из файла.
Я предоставляю свой код, а также ошибку. Любая помощь будет очень полезна.

#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)) 
Смежные вопросы