2016-05-29 8 views
-1

Ich muss erkennen, in welcher Zeile die Zeichenfolge in csv-Datei in c .. ive versucht mit dem Zählen der '\ n' mal bis wir zu unserem bekommen string place ... aber es immer drucken, das ist in der zweiten Zeile, egal was die Eingabe ist. sein wie sein nicht wirklich um die Datei zu lesen und kopieren Sie den Text zu Buff String ... und auch die strcpsn Arbeit nichtwie in der Zeile zu finden ist die Zeichenfolge in csv-Datei in c

printf("\nEnter the string you want to search: "); 
getchar(); 
myFgets(str, LEN); //getting input 

file = fopen(adr, "r"); //opening file 
if (file == NULL) 
{ 
    printf("Eror opening first file\n"); 
    return 1; 
} 

fseek(file, 0, SEEK_END); 
len = ftell(file); 
fseek(file, 0, SEEK_SET); 

char* buff = (char*)calloc(strlen(str), sizeof(char)); 
if (buff == NULL) 
{ 
    printf("Allocation eror!\n"); 
    return 1; 
} 
fread(buff, sizeof(char), len, file); 
seek = strcspn(buff, str); //checking where is the string starting 
while (lineSeek <= seek) 
{ 
    ch = fgetc(file); 
    if (ch == '\n') 
    { 
     line++; 
     lineSeek = ftell(file); 
    } 
} 

printf("its on %d line", line + 1); 
+0

Sie haben einen Schmortopf mit 'fseek' und' calloc' und 'fread' und' feof' und 'fgetc'. Wenn dies eine Textdatei ist, bleiben Sie bei textbasierten Funktionen. Sie lesen jede Zeile mit 'fgets' und prüfen, ob sie Ihre Zeichenfolge mit' strstr' enthält, bis Sie sie gefunden haben. Ich schlage vor, wieder zu beginnen, sorry, mit einem schönen langen 'char []' Puffer, um jede Zeile einzulesen. –

+1

Warum verwenden Sie den Rückkehrcode von 'feof', um zu bestimmen, wie viele Zeichen zuerst aus der Datei gelesen werden sollen? –

+0

behoben, dass ... aktualisiert. funktioniert immer noch nicht ... –

Antwort

0

Sie können machen es schwieriger, als es sein muss. Sie können strstr verwenden, um jede Zeile so zu suchen, wie sie für Ihren Suchbegriff gelesen wird. Sie können strchr bestätigen verwenden, dass die Leitung eine '\n' enthält, bevor Sie Ihre Zeilenanzahl erhöht wird (gegen eineKurz lesen zu schützen fgets verwenden.

Putting, dass zusammen, alles, was benötigt wird, ist die folgende. Beachten Sie den Code nimmt der Suchbegriff als erstes Argument und benennen Sie die Datei als zweite suchen (wenn kein zweites Argument angegeben wird, ist es von stdin standardmäßig gelesen werden):

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

enum { MAXC = 512 }; 

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

    if (argc < 2) { 
     fprintf (stderr, "insufficient input, usage: %s term [file (stdin)]\n", 
       argv[0]); 
     return 1; 
    } 

    size_t found = 0, line = 0; 
    char buf[MAXC] = ""; 
    char *term = argv[1]; 
    FILE *fp = argc > 2 ? fopen (argv[2], "r") : stdin; 

    if (!fp) { 
     fprintf (stderr, "error: file open failed '%s'.\n", argv[2]); 
     return 1; 
    } 

    while (fgets (buf, MAXC, fp)) {  /* read each line */ 
     if (strstr (buf, term)) {  /* test for term */ 
      found = 1; break;   /* set found flag */ 
     } 
     if (strchr (buf, '\n')) line++; /* increment line */ 
    } 
    if (fp != stdin) fclose (fp); 

    if (found) printf ("'%s' found on line %zu.\n", term, line + 1); 

    return 0; 
} 

Anmerkung: wenn Sie vergleichen wollen ganze Felder können Sie jede Zeile mit strsep in Token setzen, bevor Sie jedes Token mit dem Suchbegriff vergleichen. Wenn leere Felder kein Problem sind, kann strtok verwendet werden.

Beispiel Eingabe

$ cat dat/search.csv 
my,dog,has,fleas 
the,other,one,doesn't 
the,cat,has,none 
the,snake,is,done 

Beispiel Verwendung/Output

$ ./bin/searchcsv cat <dat/search.csv 
'cat' found on line 3. 

es über suchen und lassen Sie mich wissen, wenn Sie Fragen haben.