06. juni 2003 - 10:13
Der er
21 kommentarer og 1 løsning
Hente data fra fil
Hej experts. Jeg lavet et program som skriver noget tekst i en .csv fil. Nu skal jeg lave et nyt program som henter dato fra filen! Filens indhold ser sådan ud! Date Time Host User Ip info info info info info info info info info info info info info info info Filensnavn generes automatisk efter dato'en. Men først om fremmest skal jeg bruge en go måde at få fat i disse data på. Jeg er ret amatør ;-)
Annonceindlæg fra Conscia
Skrev forkert!!! Nu skal jeg lave et nyt program som henter data fra filen!
Læs to linier og smid data væk for at kome af med header. Læs hver linie med de enkelte dele. Noget i retning af: FILE *fp; char line[256]; fp = fopen(filnavn, "r"); fgets(line,sizeof(line),fp); fgets(line,sizeof(line),fp); while(!feof(fp)) { fscanf("%s %s %s %s %s",date,time,host,user.ip); // gør noget med date+time+host+user+ip }
Ups der manglede lige et argument til fscanf: fscanf(fp,"%s %s %s %s %s",date,time,host,user.ip);
Komplet eksempel: #include <stdio.h> int main() { FILE *fp; char line[256],date[32],time[32],host[32],user[32],ip[32]; fp = fopen("test.dat", "r"); fgets(line,sizeof(line),fp); fgets(line,sizeof(line),fp); while(!feof(fp)) { fscanf(fp,"%s %s %s %s %s",date,time,host,user,ip); printf("%s %s %s %s %s\n",date,time,host,user,ip); } }
Du skrev ikke noget om C versus C++ eller platform, så det blev en standard C løsning der skulle virke med alt.
hej arne. Så er jeg klar igen på lidt programming. Har været væk et stykke tid.... Ja, det virker fint! og det er også noget af det jeg skal bruge... Ovenstående er et login script som køre når brugeren logger ind. Nu skal jeg bruge et logud script. Dvs at logud scriptet skal gå ind i samme fil og finde brugernavnet og derefter skrive en linjer nedenunder. Det som jeg skal til at lave er: Et script der kigger ned i samme fil og finder samme brugernavn og derefter laver en linje nedenunder...Har du evt en go måde at udtænke det på... Du har jo hjulpet mig mange gange før ...griner..
Det skal vel så være noget i stil med: #include <stdio.h> #include <string.h> int main() { FILE *fp; char line[256],date[32],time[32],host[32],user[32],ip[32]; fp = fopen("test.dat", "r"); fgets(line,sizeof(line),fp); fgets(line,sizeof(line),fp); while(!feof(fp)) { fscanf(fp,"%s %s %s %s %s",date,time,host,user,ip); printf("%s %s %s %s %s\n",date,time,host,user,ip); if(strcmp(user,target)==0) { printf("en ny indsat linie"); } } } int main() { FILE *fp; char line[256],date[32],time[32],host[32],user[32],ip[32]; char target[32]; strcpy(target,"user38"); fp = fopen("test.dat", "r"); fgets(line,sizeof(line),fp); fgets(line,sizeof(line),fp); while(!feof(fp)) { fscanf(fp,"%s %s %s %s %s",date,time,host,user,ip); printf("%s %s %s %s %s\n",date,time,host,user,ip); } }
08. juli 2003 - 12:51
#10
(bare ignorer den sidste kopi - jeg har vist ramt CTRL/V en gang for meget)
08. juli 2003 - 13:32
#11
Ok ellers... Jeg får hele tiden fejl ved "if(strcmp(user,target)==0)" Den siger undefined symbol 'target' ??? har du en ide til det?
08. juli 2003 - 13:48
#12
Det er mig som er en spade. Jeg satte testet ind i den første kopi men erklærede target i den anden kopi. Det er linierne: char target[32]; strcpy(target,"user38");
08. juli 2003 - 14:06
#13
#include <stdio.h> #include <string.h> int main() { FILE *fp; char line[256],date[32],time[32],host[32],user[32],ip[32]; char target[32]; strcpy(target,"user38"); fp = fopen("test.dat", "r"); fgets(line,sizeof(line),fp); fgets(line,sizeof(line),fp); while(!feof(fp)) { fscanf(fp,"%s %s %s %s %s",date,time,host,user,ip); printf("%s %s %s %s %s\n",date,time,host,user,ip); if(strcmp(user,target)==0) { printf("en ny indsat linie"); } } }
08. juli 2003 - 14:30
#14
Jeg vil nu ikke kalde dig en spade!!! Hvad gør det her helt præcis? Det er som om den indsætter en ny linjer efter hver bruger nu? Det er også meget smart ;) denne kode skriver username: DWORD nUserName = sizeof(UserName); if (GetUserName(UserName, &nUserName) == 0) cout << UserName << endl; fprintf(fptr, UserName); Hvis nu, den validere brugernavnet først og derefter kigger i filen, hvor brugernavnet sidst var og derefter laver en linje nedenunder, ville det være for vildt eller....?
08. juli 2003 - 14:37
#15
Den kode leder efter et bestemt brugernavn og skriver en ny linie ud nedenunder den linie, hvor den finder det brugernavn. target er variablen som indeholde rbrugernavn. Og da jeg ikke ved hvor du får det brugernavn fra satte jeg det bar etil "user38" med: strcpy(target,"user38");
08. juli 2003 - 15:11
#16
arhaa... så forstår jeg bedre. Men hvis nu jeg har en stor fil der ligner den som jeg prøvede at illustrere foroven og mit navn står 2 gange i den kan den ikke finde det, hvis jeg ændre user38 til mit eget? Er det ik det den skulle eller har jeg misforstået noget?
08. juli 2003 - 15:20
#17
Jo. Dte er username kolonnen ? Og du er opmærksom på at der er forskel på store og små bogstaver ?
08. juli 2003 - 15:46
#18
hehe... nææ, det var jeg faktisk ik? Men det virker stadig ik? Du får lige koden, så kan du se ;) #include <stdio.h> #include <conio.h> #include <string.h> int main() { FILE *fp; char path[256], target[32]; sprintf(path, "\\\\backupkbh\\dmgtest\\08-07-2003.csv"); char line[256],date[32],time[32],host[32],user[32],ip[32]; strcpy(target,"DMG"); fp = fopen(path, "r"); fgets(line,sizeof(line),fp); fgets(line,sizeof(line),fp); while(!feof(fp)) { fscanf(fp,"%s %s %s %s %s",date,time,host,user,ip); printf("%s %s %s %s %s\n",date,time,host,user,ip); if(strcmp(user, target)==0) { printf("en ny indsat linie"); getch(); } } }
08. juli 2003 - 15:52
#19
Og næstsidste kolonne i filen indeholder DMG i en elelr flere rækker ?
09. juli 2003 - 10:22
#20
ups, nej faktisk er det 3 sidste ;) Der er 6 ialt... Er det fejlen ?
09. juli 2003 - 10:31
#21
Øh. Ja - koden ovenfor baserer sig på 5 kolonner hvor user er næstsidste. Så det kunne godt lyde som noget der skuylle rettes til.
09. juli 2003 - 11:59
#22
dmg - hvor fejl tolerant skal det være, hvis det helst ikke må gå galt så skal fscanf som det mindste udskiftes med en fgets og en sscanf og char line[256],date[32],time[32],host[32],user[32],ip[32]; skal alle være lige lange for at undgå bufferoverløb.
Kurser inden for grundlæggende programmering