narbi Δημοσ. 14 Ιουνίου 2008 Δημοσ. 14 Ιουνίου 2008 Γειά σας, έχω ένα αρχείο txt το οποίο είναι όπως αυτό παρακάτω: > # # @(#)services 8.1 (Berkeley) 6/9/93 # tcpmux 1/tcp # TCP port multiplexer (RFC1078) echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users daytime 13/tcp daytime 13/udp netstat 15/tcp qotd 17/tcp quote chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp 21/tcp telnet 23/tcp smtp 25/tcp mail time 37/tcp timserver time 37/udp timserver και από αυτά θέλω όταν διαβάζω το αρχείο να παραλείπω όποια γραμμή ξεκινάει με # και στα υπόλοιπα να εμφανίζω την οθόνη τα 2 πρώτα tabs κι επιπρόσθετα κάθε / που έχω πριν από τα πρωτόκολλα να το αντικαθιστώ με ένα tab. Δηλαδή να έχει ως έξοδο στην οθόνη την ακόλουθη μορφή: > chargen 19 tcp chargen 19 udp ftp 21 tcp telnet 23 tcp Έχω στο μυαλό μου ότι μάλλον θα πρέπει να συνδυάσω fscanf με fgetc μέσα σε 2 while αλλά εκεί που "κολλάω" είναι το πως θα το κάνω να διαβάζει μόνο τα 2 πρώτα tabs (τι συνθήκη) και πως θα κάνει την αντικατάσταση του slash. Ευχαριστώ προκαταβολικά όποιον έχει κάποια ιδεα να προτείνει.
bokarinho Δημοσ. 14 Ιουνίου 2008 Δημοσ. 14 Ιουνίου 2008 Λίγο πριν δούμε το παιχνίδι και πάντα καλή επιτυχία στην Εθνική μας έφτιαξα στα γρήγορα σε C, αυτό που ζητάς. Δεν είναι κάτι το ιδιαίτερα δύσκολο αρκεί να έχεις την προσοχή σου σε κάποια σημεία. Για δες και πες μου. > //--------------------------------------------------------------------------- #include <stdio.h> #include <string.h> #include <stdlib.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused //--------------------------------------------------------------------------- /* Functions Used. */ void DumpLinesFromFile(const char *filename, int *nError) { if(!filename) { fprintf(stderr, "{NULL} Filename.\n"); return; } else { /* File Pointer. */ FILE *fileptr = NULL; if((fileptr = fopen(filename, "rt")) == NULL) { fprintf(stderr, "ERROR: Can not open '%s' file.\n", filename); return; } else { char *ptrDelim = NULL; char TStringBuffer[bUFSIZ] = ""; while(1) { /* Read Line by Line. */ if(fgets(TStringBuffer, sizeof(TStringBuffer), fileptr) == NULL) break; /* Check for Error. */ if(TStringBuffer[0] == '\0') { *nError = -1; break; } /* Skip the lines that start with the sharp. */ if(TStringBuffer[0] == '#') continue; /* Clean the trimming '\n' from the end. */ if(TStringBuffer[strlen(TStringBuffer)-1] == '\n') TStringBuffer[strlen(TStringBuffer)-1] = '\0'; /* Find the '/' character. */ if((ptrDelim = strchr(TStringBuffer, '/')) == NULL) { *nError = -2; break; } /* Replace it. */ *ptrDelim = '\t'; /* Stop after reading the protocol. */ for(; *ptrDelim != ' '; ptrDelim++); *ptrDelim = '\0'; /* Dump the line in the stdout. */ fprintf(stdout,"%s\n", TStringBuffer); /* Clean the buffer. */ memset(TStringBuffer, 0, sizeof(TStringBuffer)); } fclose(fileptr); } } } /* Main Code. */ int main(int argc, char* argv[]) { int Error = 0; /* Dump it baby. */ printf("Dump Report =>\n"); DumpLinesFromFile("file.txt", &Error); printf("Hit enter to continue....\n"); getchar(); return 0; } //--------------------------------------------------------------------------- Εκτυπωμένα αποτελέσματα:
narbi Δημοσ. 14 Ιουνίου 2008 Μέλος Δημοσ. 14 Ιουνίου 2008 Ρε bokarinho είσαι Θεός ρε γμτ... Δύο pragma-τα όμως μου είναι άγνωστα στον κώδικα... :S Όλα τα υπόλοιπα από την ανάγνωση που έκανα μου δείχνουν ότι είναι ακριβώς αυτό που θέλω για να το ενσωματώσω στον υπόλοιπο κώδικά μου.. Να'σαι καλά!!
bokarinho Δημοσ. 14 Ιουνίου 2008 Δημοσ. 14 Ιουνίου 2008 Δεν είναι τίποτα το ιδιαίτερο μην ανησυχείς για αυτά. Το πρώτο δηλαδή το #pragma hdrstop ή header stop δηλώνει δηλώνει στον compiler το που τελειώνουν τα header που μπορεί να χρησιμοποιήσει για να επιταχύνει το compilation μεταξύ των build. Όσον αφορά το #pragma argused δηλώνει ότι όπως και στην δικιά σου περίπτωση δεν θα χρησιμοποιήσουμε το argv και αυτό κανονικά θα έδινε warning.
moterakias Δημοσ. 16 Ιουνίου 2008 Δημοσ. 16 Ιουνίου 2008 bokarinho, έχω μια εντελώς αρχάρια απορία σε όλο αυτό και το έχω συναντήσει πολλές φορές: αυτό το αρχείο txt το οποίο περιέχει τα δεδομένα που θα πρέπει να βρίσκεται; το έχω στο desktop,δίνω το μονοπάτι αλλά δεν το βλέπει όταν το βάζω μαζί με το αρχείο.cpp που έχω το πρόγραμμα σταματάει
dimitrispa Δημοσ. 17 Ιουνίου 2008 Δημοσ. 17 Ιουνίου 2008 a=fgetc(fp); while(1){ if(a==-1) break; else if(a=='#') { fgets(line, 1000, fp); a=fgetc(fp); } else{ putchar(a); b=fgetc(fp); while(b!='/'){ putchar(; b=fgetc(fp); } fscanf(fp, "%s", protocoll); printf(" %s\n", protocoll); fgets(line,1000,fp); a=fgetc(fp); } }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.