Brolly Δημοσ. 30 Αυγούστου 2007 Δημοσ. 30 Αυγούστου 2007 Εχω ενα .txt αρχειο στο οποιο αποθηκέυω ονοματα(ως string) και τηλεφωνα(ως integer) καπως ετσι : asdf 12345 qwjk 2783 qwkl 2837 Πως μπορω να διαγραψω ενα entry ? Δηλαδη να δινει input o user ενα ονομα και αν αυτο υπαρχει να το διαγραφει μαζι με το τηλεφωνο(δηλαδη ολη την γραμμη). Υ.Σ. Προκειτε για εναν τηλεφωνικο καταλογο.
george86 Δημοσ. 30 Αυγούστου 2007 Δημοσ. 30 Αυγούστου 2007 Ανοιξε ενα νεο αρχειο Περασε σε αυτο ολεσ τισ εγγραφεσ εκτοσ απο αυτη που θεσ να διαγραψεισ διεγραψε το πρωτο αρχειο μετονομασε το δευτερο αρχειο στο ονομα του πρωτου
Brolly Δημοσ. 30 Αυγούστου 2007 Μέλος Δημοσ. 30 Αυγούστου 2007 πως ομως θα του πω να μην γραψει στο καινουργιο αρχειο το ονομα που εδωσε ο χρηστης σαν input ?
yorgosd Δημοσ. 30 Αυγούστου 2007 Δημοσ. 30 Αυγούστου 2007 tha diavazeis to arxeio grammi grammi kai tin idia stigmi tha antigrafeis tin kathe grammi sto kainourgio arxeio..sigxronos tha kaneis check me to input tou xristi kai otan vreis tin grammi pou einai idia me to input aplos tha tin agnoiseis kai tha sinexiseis parakato..me ena for-loop kai ena if case eisai komple..
bokarinho Δημοσ. 30 Αυγούστου 2007 Δημοσ. 30 Αυγούστου 2007 πως ομως θα του πω να μην γραψει στο καινουργιο αρχειο το ονομα που εδωσε ο χρηστης σαν input ? Κοίτα το θέμα είναι να ανοίξεις το αρχείο μετά σε ένα loop να διαβαζεις σε ένα κενό buffer κάθε γραμμή και να ελέγχεις αν το όνομα είναι ίδιο με αυτό που θέλεις να διαγράψεις , αν είναι ίδιο απλά δεν την γράφεις στο νέο αρχείο, αν δεν είναι την γράφεις απλά με fprintf(file, "%s\n", buffer); Έτσι απλά, αν θέλεις κώδικα στείλε μου prive και θα τα βρούμε.
bokarinho Δημοσ. 30 Αυγούστου 2007 Δημοσ. 30 Αυγούστου 2007 Οκ ας παραθέσω λίγο κώδικα γιατί είχα να ασχοληθώ πολύ καιρό με C. Ελπίζω να σε βοηθήσω για ότι άλλο θέλεις με ρωτάς, να ξέρεις ότι το παρακάτω πρόγραμμα δεν θα δουλέψει για εγγραφές αρχείου τύπου: kostas polyxronioy 345 αλλά μόνο για εγγραφές τύπου: kostas 4456 όπως το έθεσες στην αρχή, αν θέλεις αυτήν την επέκταση θα σου πρότεινα να το σκεφτείς λίγο μόνος σου και σε βοηθάμε όποτε θέλεις. > #include <stdio.h> #include <stdlib.h> #include <string.h> #define MEM_ERROR -4 #define NFILE_ERROR -3 #define FILE_ERROR -2 #define NULLFILENAME -1 int DeleteRecordFromFile(char *filename, char *newfilename, char *delName) { if(filename == NULL || delName == NULL) { fprintf(stderr,"Error, earlier exit..\n"); return NULLFILENAME; } else { //File. FILE *file = fopen(filename, "r"); FILE *nfile = fopen(newfilename, "w"); //Index. int i = 0; //Buffer. char *buffer = NULL; if(!file) { fprintf(stderr, "Error opening '%s' file.\n", filename); return FILE_ERROR; } if(!nfile) { fprintf(stderr, "Error opening '%s' file.\n", newfilename); return NFILE_ERROR; } else { buffer = (char *)calloc(256, sizeof(char)); if(buffer == NULL) { fprintf(stderr, "Error in memory.\n"); return MEM_ERROR; } else { while(fgets(buffer, 256, file) != NULL) { //Clean '\n' if(buffer[strlen(buffer) - 1] == '\n') buffer[strlen(buffer) - 1] = '\0'; for(i = 0; buffer[i] == delName[i]; i++); //If the names are the same then there will be a space between the name and the number in the buffer //This maybe not the most correct way to do this as tokenization would be better but will work. if(buffer[i] == ' ') { memset(buffer, 0, sizeof(buffer)); continue; } else { fprintf(nfile, "%s\n", buffer); memset(buffer, 0, sizeof(buffer)); } } //Free memory. free(buffer); //Close files. fclose(file); fclose(nfile); //Remove the old file with the new one with the deleted record. remove(filename); return 0; } } } } void PrintFile(char *filename) { FILE *file = fopen(filename, "r"); if(file) { char *test_buffer = (char *)calloc(256, sizeof(char)); while(fgets(test_buffer, 256, file) != NULL) printf("%s", test_buffer); printf("\n"); fclose(file); } } int main(int argc, char **argv) { PrintFile("test.txt"); if(!DeleteRecordFromFile("test.txt", "result.txt", "kostas")) { PrintFile("result.txt"); return 0; } } Τυπωμένα αποτελέσματα: aris 234 nikos 35 ilias 366 antwnis 3653 bagelis 67547 kostas 356 gewrgos 112 aris 234 nikos 35 ilias 366 antwnis 3653 bagelis 67547 gewrgos 112 Press any key to continue . . . Φιλικά Bokarinho!!!! //Edit Το πρόγραμμα προυποθέτει να φτιάξεις ένα αρχείο με το όνομα test.txt που να έχει τις εγγραφές αυτές που θέλεις, δες τα αποτελέσματα μου.
bookysmell2004 Δημοσ. 30 Αυγούστου 2007 Δημοσ. 30 Αυγούστου 2007 >#include <stdio.h> #include <malloc.h> #include <string.h> #define __MAX_LINE 80 FILE *fp; FILE *tp; void ReadLine(char *buffer); void WriteLine(char *line); int Contains(char *Str, char *SubStr); int main() { char blacklistname[] = "James"; //Όνομα που θες να αφαιρέσεις char *line = (char *)malloc(__MAX_LINE); fp = fopen("names.txt","r"); tp = fopen("tempnames.txt","w"); while (strcmp(line,"")) { ReadLine(line); if( !Contains(line,blacklistname) ) { WriteLine(line); } } fclose (fp); fclose(tp); } void ReadLine(char *buffer) { int i=0, tempchar=0; tempchar = fgetc(fp); for (i=0 ; tempchar!=-1 && tempchar!='\n' ; i++) { *(buffer+i) = tempchar; tempchar = fgetc(fp); } *(buffer+i) = 0; return buffer; } void WriteLine(char *line) { fprintf(tp,"%s\n",line); } int Contains(char *Str, char *SubStr) { char *source = (char*)malloc(__MAX_LINE); int i=0; for (i=0 ; ; i++) { if (*(Str+i)==' ') { break; } *(source+i)=*(Str+i); } *(source+i)=0; if (strcmp(source,SubStr)) { return 0; } else { return 1; } } Έχε υπόψην ότι δεν είναι ολοκληρωμένος ο κώδικας... Θα χρειαστεί να προσθέσεις υλικό από μόνος σου ώστε να το φέρεις στα μέτρα σου. EDIT: Με πρόλαβε ο bokarinho καθώς έγγραφα XD
Directx Δημοσ. 31 Αυγούστου 2007 Δημοσ. 31 Αυγούστου 2007 Υπάρχει και η λύση του in-memory setup ώστε να εξαλείψουμε την ανάγκη για κάποιο προσωρινό αρχείο.. Ο κώδικας είναι γραμμένος στα γρήγορα με CodeGear Turbo C++ και μπορεί να περιέχει Bugs ή άλλες αβλεψείες. > /*-Delete User+Line (c)Directx-----------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef __BORLANDC__ #pragma hdrstop #endif /*---------------------------------------------------------------------------*/ char *pszUserToRemove = "GARY"; #ifdef __BORLANDC__ #pragma argsused #endif int main(int argc, char* argv[]) { FILE *Stream = NULL; char szLine[bUFSIZ]; /* BUFSIZ for CodeGear Turbo C/C++ is 512 bytes long */ char* pszData = NULL; int nDataLen = 0, nOffset = 0; if((Stream=fopen(argv[1],"rt"))==NULL) printf("Cannot open file for read - \"%s\n",argv[1]); else { /* * User name should contain a trailing space to assure secure word matching! */ strcat(pszUserToRemove," "); /* * Read each file line */ while(fgets(szLine,BUFSIZ,Stream)!=NULL) { /* * Match user name (case sensitive) */ if(memcmp(szLine,pszUserToRemove,strlen(pszUserToRemove))) { /* * User name differs from pszUserToRemove so append line * in memory pszData buffer.. */ if((pszData = realloc(pszData,(nDataLen+=strlen(szLine))))==NULL) { free(pszData); fclose(Stream); printf("Out of memory!\n"); return -1; } strcpy(&pszData[nOffset],szLine); nOffset = nDataLen; } } fclose(Stream); #ifdef _DEBUG printf("%s",pszData); #endif /* * Reopen stream and dump pszData */ if((Stream=fopen(argv[1],"wt"))==NULL) printf("Cannot open file for write - \"%s\"\n",argv[1]); else if(fwrite(pszData,nDataLen,1,Stream)!=1) printf("Cannot write to file - \"%s\n",argv[1]); fclose(Stream); } printf("\nPress Enter to exit.."); getchar(); return 0; } INPUT.TXT: > GARY 1234567 PAULA 1234567 AGNUS 1234567 Υ.Γ. Υποθέτουμε πως η μορφή εισόδου είναι πάντα ΟΝΟΜΑ_ΑΡΙΘΜΟΣ ή τουλάχιστον ΟΝΟΜΑ_ όπου _=Κενό (space).
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.