lecture13-files.pdf - Προγραμματισμός...

Info icon This preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Προγραμματισμός Αρχεία Προγραμματισμός Χρησιμότητα Μεγάλος όγκος δεδομένων Αποθήκευση μετά το σβήσιμο του ΗΥ Δευτερεύουσα μνήμη Ένα απλό αρχείο "Lecture_4" Προγραμματισμός Αρχεία Η C++ βλέπει κάθε αρχείο σαν μια σειρά από bytes – Κάθε αρχείο «κλείνει» με end-of-file marker Μπορούμε να ανοίξουμε ένα αρχείο για διάβασμα, είτε για γράψιμο Το άνοιγμα του αρχείου συνεπάγεται την επιστροφή ενός δείκτη σε FILE structure Προγραμματισμός Streams Σειριακή επικοινωνία Μονόδρομη προσπέλαση Διάκριση σε output και input stream. "cin«, πληκτρολόγιο "cout«, οθόνη Προγραμματισμός Τα "cin" και "cout" είναι instances κάποιων (stream) objects. Header file "fstream". #include<fstream> Προγραμματισμός Creating Streams Δήλωση μεταβλητών ifstream in_stream; ofstream out_stream; Είναι μεταβλητές που δείχνουν στο αρχείο (pointers). Το "in_stream1 = in_stream2" δεν αντιγράφει τα αρχεία. Προγραμματισμός Connecting and Disconnecting Streams to Files Connects ifstream "in_stream" to the file "Lecture_4": in_stream.open("Lecture_4.txt"); This connects "in_stream" to the beginning of "Lecture_4". Connects the ofstream "out_stream" to the file "Lecture_4": out_stream.open("Lecture_4.txt"); Although this connects "out_stream" to "Lecture_4", it also deletes the previous contents of the file, ready for new input. Προγραμματισμός Σειριακή προσπέλαση Προγραμματισμός 1 // basic file operations 2 #include <iostream> 3 #include <fstream> 4 using namespace std; 5 6 int main () { 7 ofstream myfile; 8 myfile.open ("example.txt"); 9 myfile << "Writing this to a file.\n"; 10 myfile.close(); 11 return 0; 12 } Προγραμματισμός [file example.txt] Writing this to a file. int main() { char str[10]; //Creates an instance of ofstream, and opens example.txt ofstream a_file ( "example.txt" ); // Outputs to example.txt through a_file a_file<<"This text will now be inside of example.txt"; // Close the file stream explicitly a_file.close(); //Opens for reading the file ifstream b_file ( "example.txt" ); //Reads one string from the file b_file>> str; //Should output ‘This' cout<< str <<"\n"; b_file.close(); } Προγραμματισμός Include files #include <ifstream> Library to specifically deal with input of text files. Does not deal with output. #include <ofstream> Library to specifically deal with output of text files. Does not deal with input. #include <fstream> Library to deal with BOTH input and output. Προγραμματισμός Διαχείρηση σφαλμάτων Η κλήση in_stream.fail(); επιστρέφει True αν η προηγούμενη ενέργεια στην "in_stream" ήταν ανεπιτυχής (π.χ. προσπαθήσαμε να ανοίξουμε ανύπαρκτο αρχείο για ανάγνωση) int main() { ifstream in_stream; in_stream.open("Lecture_4"); if (in_stream.fail()) { cout << "Sorry, the file couldn't be opened!\n"; exit(1); } ... Προγραμματισμός int main () { ofstream myfile; myfile.open ("example.txt"); if(myfile.is_open()) { myfile << "Hello world! " << endl; myfile.close(); } else cout << "Can't open the file!" << endl; } Προγραμματισμός ios::in Open for input operations. ios::out Open for output operations. ios::binary Open in binary mode. ios::ate Set the initial position at the end of the file. If this flag is not set to any value, the initial position is the beginning of the file. ios::app All output operations are performed at the end of the file, appending the content to the current content of the file. This flag can only be used in streams open for output-only operations. ios::trunc If the file opened for output operations already existed before, its previous content is deleted and replaced by the new one. Προγραμματισμός File open modes Προγραμματισμός File open modes ofstream myfile; myfile.open ("example.bin", ios::out | ios::app | ios::binary); class default mode parameter ofstream ios::out ifstream ios::in fstream ios::in | ios::out ofstream myfile ("example.bin", ios::out | ios::app | ios::binary); Προγραμματισμός Κλείσιμο Αρχείων Ότι ανοίγει, πρέπει να κλείνει – Το πρόγραμμα δεν πρέπει να αφήνει ανοιχτά αρχεία μπορεί να μην περάσουν όλες οι αλλαγές σας δυσχεραίνει η πρόσβαση σε αυτά από άλλα προγράμματα close() – – – κλείνει το αρχείο Επιστρέφει 0 αν είναι επιτυχής και EOF διαφορετικά Γίνεται αυτόματα με το τέλος του προγράμματος Είναι καλή πρακτική να γίνεται από τον προγραμματιστή myfile.close(); Προγραμματισμός Text files - Output 1 // writing on a text file 2 #include <iostream> 3 #include <fstream> 4 using namespace std; 5 6 int main () { 7 ofstream myfile ("example.txt"); 8 if (myfile.is_open()) 9 { 10 myfile << "This is a line.\n"; 11 myfile << "This is another line.\n"; 12 myfile.close(); 13 } 14 else cout << "Unable to open file"; 15 return 0; 16 } Προγραμματισμός [file example.txt] This is a line. This is another line. Text files - Input 1 // reading a text file 2 #include <iostream> 3 #include <fstream> 4 #include <string> 5 using namespace std; 6 7 int main () { 8 string line; 9 ifstream myfile ("example.txt"); 10 if (myfile.is_open()) 11 { 12 while ( myfile.good() ) 13 { 14 getline (myfile,line); 15 cout << line << endl; 16 } 17 myfile.close(); 18 } 19 20 else cout << "Unable to open file"; 21 22 return 0; 23 } Προγραμματισμός This is a line. This is another line. Τέλος προσπέλασης The boolean expression in_stream.eof() will now evaluate to True. Προγραμματισμός Character Input and Output "get(...)" This function takes a single argument of type "char". in_stream.get(ch) : – – the variable "ch" is assigned the value "'4'", and the ifstream "in_stream" is re-positioned so as to be ready to input the next character in the file. Προγραμματισμός Character Input and Output "put(...)" This function takes a single argument of type "char“. We can input or write single characters to a file opened via an ofstream using the member function "put(...)". out_stream.put('4'); changes the state to: Προγραμματισμός Αντιγραφή του "Lecture_4" σε οθόνη και στο αρχείο "Copy_of_4". int main() { char character; ifstream in_stream; ofstream out_stream; in_stream.open("Lecture_4"); out_stream.open("Copy_of_4"); in_stream.get(character); Προγραμματισμός while (!in_stream.eof()) { cout << character; out_stream.put(character); in_stream.get(character); } out_stream.close(); in_stream.close(); return 0; } State flags bad() Returns true if a reading or writing operation fails. For example in the case that we try to write to a file that is not open for writing or if the device where we try to write has no space left. fail() Returns true in the same cases as bad(), but also in the case that a format error happens, like when an alphabetical character is extracted when we are trying to read an integer number. eof() Returns true if a file open for reading has reached the end. good() It is the most generic state flag: it returns false in the same cases in which calling any of the previous functions would return true. Προγραμματισμός Παράμετροι σε συναρτήσεις int main() { ifstream in_stream; ofstream out_stream; in_stream.open("Lecture_4"); out_stream.open("Copy_of_4"); copy_to(in_stream, out_stream); out_stream.close(); in_stream.close(); return 0; } Προγραμματισμός void copy_to(ifstream& in, ofstream& out) { char character; in.get(character); while (!in.eof()) { cout << character; out.put(character); in.get(character); } } Τυχαία προσπέλαση Προγραμματισμός Τρέχουσα Θέση Μία από τις πληροφορίες που διατηρούνται στις δομές τύπου FILE για κάθε αρχείο είναι η τρέχουσα θέση εγγραφής/ανάγνωσης Όταν κάνουμε εγγραφή κειμένου σε ένα αρχείο η εγγραφή γίνεται στην τρέχουσα θέση μέσα στο αρχείο. Όταν κάνουμε ανάγνωση κειμένου η ανάγνωση γίνεται από την τρέχουσα θέση στο αρχείο. Η τρέχουσα θέση αυξάνει ανάλογα με τους χαρακτήρες που έχουμε γράψει ή διαβάσει Η τρέχουσα θέση όταν πρωτοανοίξουμε ένα αρχείο εξαρτάται από το mode στην fopen Μπορούμε να αλλάξουμε την τρέχουσα θέση με την συνάρτηση fseek (αναλυτικά μετά) Προγραμματισμός Βασικές εντολές fseek() Sets the position to a desired point in the file ftell() Gives the current position in the file rewind() Sets the position to the beginning of the file Προγραμματισμός get and put stream pointers ifstream, like istream, has a pointer known as the get pointer that points to the element to be read in the next input operation ofstream, like ostream, has a pointer known as the put pointer that points to the location where the next element has to be written. Finally, fstream, inherits both, the get and the put pointers, from iostream (which is itself derived from both istream andostream). These internal stream pointers that point to the reading or writing locations within a stream can be manipulated using the following member functions: Προγραμματισμός tellg() and tellp() These two member functions have no parameters and return a value of the member type pos_type, which is an integer data type representing the current position of the get stream pointer (in the case of tellg) or the put stream pointer (in the case of tellp). Προγραμματισμός seekg() and seekp() These functions allow us to change the position of the get and put stream pointers. Both functions are overloaded with two different prototypes. The first prototype is: seekg ( position ); seekp ( position ); Using this prototype the stream pointer is changed to the absolute position position (counting from the beginning of the file). The type for this parameter is the same as the one returned by functions tellg and tellp: the member type pos_type, which is an integer value. Προγραμματισμός 1 // obtaining file size 2 #include <iostream> 3 #include <fstream> 4 using namespace std; 5 6 int main () { 7 long begin,end; 8 ifstream myfile ("example.txt"); 9 begin = myfile.tellg(); 10 myfile.seekg (0, ios::end); 11 end = myfile.tellg(); 12 myfile.close(); 13 cout << "size is: " << (end-begin) << " 14 bytes.\n"; 15 return 0; } Προγραμματισμός size is: 40 bytes. Προγραμματισμός Δυαδικά αρχεία Προγραμματισμός File streams include two member functions specifically designed to input and output binary data sequentially: write and read. The first one (write) is a member function of ostream inherited by ofstream. And read is a member function of istream that is inherited by ifstream. Objects of class fstream have both members. Their prototypes are: write ( memory_block, size ); read ( memory_block, size ); Προγραμματισμός 1 // reading a complete binary file 2 #include <iostream> 3 #include <fstream> 4 using namespace std; 5 6 ifstream::pos_type size; 7 char * memblock; 8 9 int main () { 10 ifstream file ("example.bin", ios::in|ios::binary|ios::ate); 11 if (file.is_open()) 12 { 13 size = file.tellg(); 14 memblock = new char [size]; 15 file.seekg (0, ios::beg); 16 file.read (memblock, size); 17 file.close(); 18 19 cout << "the complete file content is in memory"; 20 21 delete memblock; 22 } 23 else cout << "Unable to open file"; 24 return 0; 25 } Προγραμματισμός the complete file content is in memory Προγραμματισμός Παραδείγματα σε C Προγραμματισμός Άνοιγμα Αρχείων FILE *fp; – Δημιουργεί έναν FILE pointer με όνομα fp FILE *fopen(const char *fname, const char *mode); – Δύο ορίσματα: filename: το όνομα του αρχείου που θα ανοίξει mode: Καθορίζει αν το αρχείο ανοιχτεί για διάβασμα ή γράψιμο – Η fopen επιστρέφει έναν FILE pointer στο αρχείο Σε περίπτωση αποτυχίας επιστρέφει NULL FILE *fopen(const char *path, const char *mode); Προγραμματισμός Τέλος προσπέλασης Οι συναρτήσεις ανάγνωσης επιστρέφουν EOF, ή (FILE *) NULL, όταν φτάσουν στο τέλος του αρχείου Η συνάρτηση: int feof ( FILE * stream ); επιστρέφει 0 για τέλος αρχείου και διαφορετικά (!0), αλλιως, Π.χ. while (!feof(ifp)) { if (fscanf(ifp, "%s %d", username, &score) != 2) break; fprintf(ofp, "%s %d", username, score+10); } Προγραμματισμός Ανίχνευση λαθών if ((output_file = fopen("output_file", fprintf(stderr, Προγραμματισμός "w")) == (FILE *) NULL) "Cannot open file.\n"); Δημιουργία αρχείου κειμένου main( ) { FILE *fp; int index; fp = fopen(“mytestfile.txt”,"w"); /* open for writing */ for (index = 1;index <= 10;index++) fprintf(fp,"Line number %d\n", index); fclose(fp); /* close the file before ending program */ } Προγραμματισμός Ανάγνωση και προβολή αρχείου κειμένου int main( ) { FILE *funny; int c; funny = fopen("file2read.txt","r"); if (funny == NULL) { printf("File doesn’t exist\n"); return 1; } do { c = getc(funny); /* get a character from the file */ putchar(c); /* display it on the monitor */ } while (c != EOF); /* until EOF */ fclose(funny); } Προγραμματισμός Αντιγραφή αρχείου σε άλλο void filecopy(FILE *ifp, FILE *ofp) { int c; while ((c = getc(ifp)) != EOF) putc(c, ofp); } FILE *ifp = fopen(“input.txt”,”r”); FILE *ofp = fopen(“output.txt”,”w”); filecopy(ifp, ofp); fclose(ifp); fclose(ofp); Προγραμματισμός Append a file #include <stdio.h> int main() { FILE *fp file = fopen("file.txt","a"); fprintf(fp,"%s","This is just an example :)"); /*append some text*/ fclose(fp); return 0; } Προγραμματισμός Παράδειγμα – ανάγνωση λέξεων υποθέτει πως 1 γραμμή <999 chars void somefunction(char *file) { FILE *fp; char s[1000]; if ((fp = fopen(file, "r")) == NULL) { printf(“Can not open the file %s\n”,file); return; } while (fscanf(fp,”%s”,s) != EOF) { printf(“%s”,s); } fclose(fp); } Προγραμματισμός Ανάγνωση/Εγγραφή byte προς byte fgetc (αντίστοιχη της getchar) – – – Διαβάζει έναν χαρακτήρα από αρχείο Όρισμα: FILE pointer fgetc( stdin ) ισοδύναμο με getchar() fputc (αντίστοιχη της putchar) – – – Γράφει έναν χαρακτήρα σε αρχείο Όρισμα: FILE pointer και ένας χαρακτήρας για να γραφεί fputc( 'a', stdout ) ισοδύναμο με putchar( 'a' ) Προγραμματισμός Ανάγνωση/Εγγραφή γραμμή προς γραμμή fgets – – Διαβάζει μια γραμμή από ένα αρχείο char *fgets(char *line, int maxline, FILE *fp) fputs – – Γράφει μια γραμμή σε ένα αρχείο int fputs(char *line, FILE *fp) Προγραμματισμός Μορφωμένη (formated) ανάγνωση/εγγραφή fscanf / fprintf – Ισοδύναμες των scanf και printf για αρχεία Προγραμματισμός EOF pitfall A common mistake when using fgetc, getc, or getchar is to assign the result to a variable of type char before comparing it to EOF. The following code fragments exhibit this mistake, and then show the correct approach (using type int): Mistake Correction char c; while ((c = getchar()) != EOF) putchar(c); int c; while ((c = getchar()) != EOF) putchar(c); • Σύγχηση του EOF με έναν από τους 256 χαρακτήρες • Αλλίως: check feof and ferror after getchar returns EOF. Προγραμματισμός Standard file pointers in UNIX FILE *stdin, *stdout, *stderr; automatically open to all C programs since these files are already open, there is no need to use fopen on them Προγραμματισμός Τρία Ειδικής Χρήσης Αρχεία Το λειτουργικό σύστημα, με το που αρχίζει να τρέχει το πρόγραμμά, ανοίγει τρία αρχεία και ορίζει τους δείκτες stdin, stdout, stderr να δείχνουν στις αντίστοιχες δομές FILE. Κανονικά : – – – stdin: αντιστοιχεί στο πληκτρολόγιο! Ότι κουμπί πατιέται θεωρείται ότι διαβάζεται από ένα αρχείο stdout: αντιστοιχεί στην οθόνη μας. Ότι εγγράφετε σε αυτό το αρχείο εκτυπώνεται στην οθόνη stderr: αντιστοιχεί επίσης στην οθόνη μας. Χρησιμοποιείτε για μηνύματα λάθους. Προγραμματισμός Αναδιεύθυνση (redirection) στο Unix Μπορούμε να ζητήσουμε από το λειτουργικό να ανακατευθύνει τα stdin, stdout, stderr με αρχεία στο δίσκο: – – – – a.out < someinputfile Το stdin δεν είναι πλέον το πληκτρολόγιο, αλλά το αρχείο somefile a.out > someoutputfile Το stdout δεν είναι πλέον η οθόνη αλλά το someoutputfile a.out < inputfile > outputfile a.out < inputfile > outputfile >& errfile Προγραμματισμός Παράδειγμα #include <stdio.h> int main() { int i; FILE *fp; if ((fp = fopen("myfirstfile.txt", "w")) == NULL) { printf("Could not open file.\n"); return 0; } fprintf(fp, "Lets write something here.\n"); for (i = 0; i < 10; ++i) fprintf(fp, “%5d, %5d, %5d\n“,i,i*i,i*i*i); fclose(fp); // Check out the contents of the file myfirstfile.txt } Προγραμματισμός Lets write 0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, something here. 0 1 8 27 64 125 216 343 512 729 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include <stdio.h> Enter the account, name, and balance. Enter EOF to end input. ? 100 Jones 24.98 ? 200 Doe 345.67 ? 300 White 0.00 ? 400 Stone -42.16 ? 500 Rich 224.62 ? int main() { int account = 1; char name[ 30 ]; double balance; FILE *cfPtr; /* cfPtr = clients.dat file pointer */ if ( ( cfPtr = fopen( "clients.dat", "w" ) ) == NULL ) printf( "File could not be opened\n" ); else { printf( "Enter the account, name, and balance.\n" ); printf( "Enter EOF to end input.\n" ); printf( "? " ); scanf( "%d%s%lf", &account, name, &balance ); while (account > 0) { fprintf( cfPtr, "%d %s %.2f\n", account, name, balance ); printf( "? " ); scanf( "%d%s%lf", &account, name, &balance ); } fclose( cfPtr ); } Προγραμματισμός return 0; } Η Βιβλιοθήκη Εισόδου/Εξόδου Στο stdio.h – – – – Δηλώνεται ο τύπος δεδομένων FILE (με typedef) με όλες τις πληροφορίες που χρειάζονται για προσπέλαση του αρχείου από τις αντίστοιχες συναρτήσεις Ορίζονται 3 αρχεία stdin, stdout, stderr (θα δούμε ποια είναι αυτά σε λίγο) Ορίζονται οι τιμές των σταθερών NULL EOF (End Of File) Δηλώνονται συναρτήσεις προσπέλασης αρχείων Προγραμματισμός fread() / fwrite() size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); Μπορεί να χρησιμοποιηθεί για κάθε μεταβλητή (ακόμη και για απλές ή στατικές με χρήση του &) Προγραμματισμός Δυαδικά αρχεία fwrite – «γράφει» δεδομένα από μια περιοχή μνήμης σε ένα αρχείο Παράδειγμα: fwrite( &number, sizeof( int ), 1, myPtr ); – &number – περιοχή μνήμης (δείκτης) – sizeof( int ) – μέγεθος αντικειμένων – 1 – αριθμός αντικειμένων (1 για απλές μεταβλητές) – myPtr – αρχείο για μεταφορά fread – «διαβάζει» δεδομένα από ένα αρχείο σε μια περιοχή μνήμης fread( &client, sizeof (int), 1, myPtr ); – Μπορεί να «διαβάσει» ολόκληρο τον πίνακα Προγραμματισμός Μετακίνηση του δείκτη αρχείου fseek – – Πάει το δείκτη σε μια συγκεκριμένη θέση fseek( pointer, offset, symbolic_constant ); pointer – file pointer offset – θέση file pointer (0 η αρχή του αρχείου) symbolic_constant – καθορίζει από πού αρχίζουμε να μετράμε – – – Προγραμματισμός SEEK_SET – αρχή αρχείου SEEK_CUR – τρέχουσα θέση SEEK_END – τέλος αρχείου Παράδειγμα FILE *fp; fp=fopen("c:\\test.bin", "wb"); char x[10]="ABCDEFGHIJ"; fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp); fclose(fp); Προγραμματισμός Παράδειγμα int main(void) { FILE *fp; size_t count; const char *str = "hello\n"; fp = fopen("sample.txt", "w"); if(fp == NULL) { perror("failed to open sample.txt"); return EXIT_FAILURE; } count = fwrite(str, 1, strlen(str), fp); printf("Wrote %d bytes. fclose(fp) %s.\n", count, fclose(fp) == 0 ? "succeeded" : "failed"); return EXIT_SUCCESS; } Προγραμματισμός 1 2 3 4 5...
View Full Document

{[ snackBarMessage ]}

What students are saying

  • Left Quote Icon

    As a current student on this bumpy collegiate pathway, I stumbled upon Course Hero, where I can find study resources for nearly all my courses, get online help from tutors 24/7, and even share my old projects, papers, and lecture notes with other students.

    Student Picture

    Kiran Temple University Fox School of Business ‘17, Course Hero Intern

  • Left Quote Icon

    I cannot even describe how much Course Hero helped me this summer. It’s truly become something I can always rely on and help me. In the end, I was not only able to survive summer classes, but I was able to thrive thanks to Course Hero.

    Student Picture

    Dana University of Pennsylvania ‘17, Course Hero Intern

  • Left Quote Icon

    The ability to access any university’s resources through Course Hero proved invaluable in my case. I was behind on Tulane coursework and actually used UCLA’s materials to help me move forward and get everything together on time.

    Student Picture

    Jill Tulane University ‘16, Course Hero Intern