2017-10-23 3 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <string.h> 


struct string_count_struct{ 
    char fname; 
    char str; 
    long long count; 

}; 



void* filesearch(void* arg) 
{ 

    //get the file name 
    struct string_count_struct *arg_ptr = (struct string_count_struct*) arg; 

    int line_num = 1; 
    int find_result = 0; 
    char temp[512]; 


    //create a file pointer 
    FILE *fp; 
    fp = fopen(arg_ptr -> fname, "r"); 

    //dont forget error handling 
    if (fp == NULL){ 
    printf("File could not be opened"); 
    return(-1); 
    } 

    while (fgets(temp, 512, fp) != NULL) { 
     if ((strstr(temp, arg_ptr -> str)) != NULL) { 
      find_result++; 
     } 
     line_num++; 
    } 

    if(find_result = 0) { 
     printf("\nSorry, couldn't find a match.\n"); 
    } 

    arg_ptr -> count = find_result; 

    //close the file 
    if (fp){ 
     fclose(fp); 
    } 

    pthread_exit(0); 


} 


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


    if (argc < 3) { 
    printf("Usage: <file> <string> <arg1> <arg2>...<argN>\n", argv[0]); 
    exit(-1); 
    } 

    int num_args = argc - 2; 

    struct string_count_struct args[num_args]; 

    //Thread Creation: 
    pthread_t tids[num_args]; 

    for(int i = 0; i < num_args; i++) { 
     args[i].fname = atoll(argv[i + 2]); 

     pthread_attr_t attr; 
     pthread_attr_init(&attr); 
     pthread_create(&tids[i], &attr, filesearch, &args[i]); 
    } 

    //Wait until work is completed 
    for (int i = 0; i < num_args; i ++){ 
    pthread_join(tids[i], NULL); 
    printf("blah is blah %lld\n", args[i].count); 
    } 





return 0; 
} 

Hier meine WarnungenIch brauche eine Erklärung mit Datei-I/OI Warnungen sind recieving Ich verstehe nicht

[email protected]:~/Desktop# gcc prog2.c -lbthread 
prog2.c: In function ‘filesearch’: 
prog2.c:29:13: warning: passing argument 1 of ‘fopen’ makes pointer from integer without a cast [-Wint-conversion] 
    fp = fopen(arg_ptr -> fname, "r"); 
      ^~~~~~~ 
In file included from prog2.c:1:0: 
/usr/include/stdio.h:274:14: note: expected ‘const char * restrict’ but argument is of type ‘char’ 
extern FILE *fopen (const char *__restrict __filename, 
       ^~~~~ 
prog2.c:34:8: warning: return makes pointer from integer without a cast [-Wint-conversion] 
    return(-1); 
     ^
prog2.c:38:21: warning: passing argument 2 of ‘strstr’ makes pointer from integer without a cast [-Wint-conversion] 
    if ((strstr(temp, arg_ptr -> str)) != NULL) { 
        ^~~~~~~ 
In file included from prog2.c:4:0: 
/usr/include/string.h:337:14: note: expected ‘const char *’ but argument is of type ‘char’ 
extern char *strstr (const char *__haystack, const char *__needle) 
       ^~~~~~ 
prog2.c: In function ‘main’: 
prog2.c:78:17: error: assignment of read-only member ‘fname’ 
    args[i].fname = atoll(argv[i + 2]); 

ich sind bin nicht sicher, was ich falsch mache, diese Fehler mein Programm verhindert Durchlesen der gewünschten Dateien und Berechnen des Auftretens einer bestimmten Zeichenfolge, die der Benutzer auswählen soll. Ich habe meinen Fehler behoben, aber nicht die Warnungen.

Das Programm wird ein Befehlszeilenargument verwenden, einen separaten Thread für jede zu durchsuchende Datei erstellen, jede Datei durchsuchen und dann die Ergebnisse angeben. Ich habe vor, einen Mutex zur weiteren Verfeinerung zu verwenden, aber im Moment versuche ich nur, meine I/O-Probleme zu lösen.

Antwort

0

Nur einige der Warnungen Adressierung, ich bin nicht sicher, ob dies den Code Arbeit machen wird:

In Zeile 29 erwartet fopen einen Dateinamen (char *) aber fname ist nur ein char in string_count_struct. Mach es zu einem char*. In der Hauptfunktion konvertieren Sie eines der Argumente von ASCII nach long long und ordnen es fname zu, das später als Dateiname fürverwendet werden soll. Das ist wahrscheinlich nicht das, was du machen willst.

In Zeile 34 geben Sie -1 zurück, das kein Zeiger ist. Sie haben die Funktion so deklariert, dass sie einen ungültigen Zeiger zurückgibt. Machen Sie es zurück (0) (oder zurück (NULL)).

Wie in Zeile 29 passiert in Zeile 38: str in der Struktur string_count_struct ist nur eine char, aber strstr erwartet eine char*. Mach es zu einem char*, auch.

Ihre "Verwendung" fehlt eine Formatstring "% s", um das Argument argv [0] tatsächlich zu drucken.

+0

Vielen Dank für die Antwort, es ist sehr geschätzt. Und Ihre Vorschläge haben mir geholfen, meine Arbeit zu verfeinern –