Обработка файлов с использованием потока API в C - PullRequest
0 голосов
/ 01 ноября 2010

Я делаю приложение, которое использует API-потоки в C, программа принимает N-файлы (N> 2) с неупорядоченными именами, для каждого файла генерируется поток выполнения, который сортирует файлы, используя функцию qsort, послеБудучи упорядоченными файлами, каждый поток должен создать файл, сохраняя исходный файл без изменений и отображая отсортированный файл в другой файл с расширением <.sorted>.Программа без проблем сортирует числа, даже если я поставлю стандартный вывод, результат отобразится на экране, но когда я пытаюсь создать выходной файл с расширением .sorted, программа вылетает.

это мой кодовый файл.c

#include <stdio.h>              /* Standard buffered input/output        */
#include <stdlib.h>             /* Standard library functions            */
#include <string.h>             /* String operations                     */
#include <pthread.h>        /* Thread related functions              */
#include "pf1.h"        /* Header specific to this app           */



pthread_attr_t attr;

void *thread_worker(void *name_file)
{

FILE *entrada, *salida;
char* nombres = (char*)name_file; 
int numero;
char temp [10000];

int i;
stats_t estadisticas;

printf ("File_name:%s\n", nombres);
entrada = fopen(nombres, "r");
salida =  fopen (strcat(nombres, ".sorted"), "w");

while (!feof(entrada)){
fscanf (entrada, "%s\n",temp);
numero++;
}

char* lista[numero]; //array to sort the file
rewind (entrada);

    for (i=0;i<numero;i++) 
    {

        fscanf(entrada," %[^\n]", temp);


        lista[i] = (char*)malloc((strlen(temp)+1)*sizeof(char));

        strcpy(lista[i], temp);

    }


size_t large = sizeof(lista) / sizeof(char *);



qsort(lista,large ,sizeof(char *) ,cstring_cmp );

printf ("Archivo Ordenado\n", i+1);

for (i=0;i<large;i++)


printf("%s\n",lista[i]);


 pthread_exit(NULL);
}


int main(int argc, char *argv [])
{

stats_t **stats;
int i, rc;
 pthread_t my_threads[argc-1]; 
 pthread_attr_init(&attr);

if (argc <3) {
printf ("|files| > 2\n");
}else{
printf("files to sorted: %d\n", argc - 1);

for (i = 1; i < argc; i++){ 

    //printf("%s%s\n", argv[i], (i < argc-1) ? " " : "");

rc = pthread_create(&my_threads[i], &attr, thread_worker, (void *)argv[i]);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n",rc);
         return -1;
      }
}

}
  return 0;

} /*end main */

это mi file.h

#ifndef PF1_H_

#define PF1_H_





typedef struct _stats_t

{

    char *longest, *shortest;

    unsigned int numlines;

} stats_t;

int cstring_cmp(const void *a, const void *b)

{

    const char **ia = (const char **)a;

    const char **ib = (const char **)b;

    return -strcasecmp(*ia, *ib);

    /* strcmp functions works exactly as expected from

    comparison function */

}


void print_cstring_array(char **array, size_t len)

{

    size_t i;



    for(i=0; i<len; i++)

        printf("%s | ", array[i]);



    putchar('\n');

}




#endif /* PF1_1_H_ */

Я хотел бы помочь с этой проблемой, потому что я не вижу, в чем ошибка ... заранее всем спасибои извините за мой английский

Ответы [ 2 ]

3 голосов
/ 01 ноября 2010

Эта строка может быть вашей проблемой:

salida =  fopen (strcat(nombres, ".sorted"), "w");

Из того, что я могу сказать, переменная nombres идет от argv.Поскольку вы не единственный, кто выделяет память для argv, вы не знаете, что для «.sorted» будет дополнительное пространство (и, вероятно, его не будет).Если вы strcpy это в свой собственный буфер с пробелом для ".sorted", у вас все будет хорошо.

#define EXT_LEN 7
#define MAX_TOTAL_LEN 250
#define MAX_FILE_LEN 242 //MAX_TOTAL_LEN - EXT_LEN - 1

char *name_ptr;
char nombres[MAX_TOTAL_LEN];
int len;

name_ptr = (char*)name_file;
len = strlen(name_ptr);
if (len > MAX_FILE_LEN) {
    len = MAX_FILE_LEN;
}
strncpy(nombres, name_ptr, len);
strcpy(nombres+len, ".sorted");
salida =  fopen (nombres, "w"); 
0 голосов
/ 01 ноября 2010

У меня когда-то были проблемы с передачей int-идентификатора при вызове функций выполнения потока. Попробуйте построить структуру с целочисленным идентификатором и именем файла, а затем передать ее в качестве параметра вашей функции thread_worker ().

...