Βόηθεια σε άσκηση C++(αρχεια)

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
Δοκιμάστε να φτιάξετε ένα μικρό πρόγραμμα που θα γράφει πολλαπλές γραμμές σε ένα αρχείο
(διαχωρισμένες μεταξύ τους με ʽ\nʼ). Στην συνέχεια, το ίδιο πρόγραμμα, θα διαβάζει από αυτό το
αρχείο, γραμμή-γραμμή, και θα τις εκτυπώνει στην οθόνη.

Βοήθεια:
Χρησιμοποιήστε τις ακόλουθες συναρτήσεις της κλάσης ifstream:
· void getline(buffer, MAX), όπου:
o buffer: μεταβλητή τύπου char[] ή char*, μέσα στην οποία θα αποθηκευτεί η κάθε
γραμμή όταν διαβαστεί.
o MAX: μια σταθερά που προσδιορίζει τον μέγιστο αριθμό χαρακτήρων που θα πρέπει
να διαβαστούν μέχρι να συναντήσει end of line.
· int eof(), η οποία μας επιστρέφει 0 αν ο αρχείο έχει τελειώσει

Μπορει καποιος να με βοηθησει σ'αυτην την ασκηση,για να μπορεσω να την κανω;
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

gsova

Δραστήριο μέλος

Ο Γιώργος αυτή τη στιγμή δεν είναι συνδεδεμένος. Επαγγέλεται Προγραμματιστής/τρια. Έχει γράψει 782 μηνύματα.
Τις γραμμές που θα αποθηκεύονται στο αρχείο θα τις εισάγει ο χρήστης από την οθόνη; :hmm:
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
μαλλον ναι
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

gsova

Δραστήριο μέλος

Ο Γιώργος αυτή τη στιγμή δεν είναι συνδεδεμένος. Επαγγέλεται Προγραμματιστής/τρια. Έχει γράψει 782 μηνύματα.
για δές εδώ: https://www.arachnoid.com/cpptutor/student2.html

προς το μέσο της σελίδας...
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
Ευχαριστω για την βοηθεια!:):):):):):)

Χρησιμοποιησα τα εξεις δυο προγραμματα για να κανω την ασκηση:

program1.cpp

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
ofstream ofs("data.txt");
for(int i =1;i <= 10;i++) {
ofs << "This is line " << i << endl;
}
return 0;
}


program2.cpp

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
ifstream ifs("data.txt");
string line;
while(getline(ifs,line)) {
cout << "[ " << line << " ]" << endl;
}
return 0;
}

[SIZE=-1]Και παλι σε ευχαριστω πολυ![/SIZE]
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
#include<fstream>
#include<iostream>
using namespace std;
int main(int argc,char *argv[])
{
if(argc!=3){
cout<<"Usage:CopyFile <from> <to>"<<endl;
return 0;
}

ifstream fin(argv[1]);
if(fin==0){
cout<<"Error: Input file cannot be opened for reading!"<<endl;
return 10;
}

ofstream fout(argv[2]);
if(fout==0){
cout<<"Error: Output file cannot be opened for writing!"<<endl;
return 10;
}

fin.seekg(0,ios::end);
size_t finsize=fin.tellg();
cout<<"Input file size: "<<finsize<<endl;

fin.seekg(0,ios::beg); // ios::beg -> from the start of the file
int c;
int percent=0;

while(fin.eof()==false)
{
c=fin.get();
if(fin.eof()==false)
fout.put(c);
cout<<"Copy completed : "<<100*percent/finsize<<"\r";
percent++;
}
fin.close();
fout.close();
}

Δοκιμάστε να αλλάξετε τον παραπάνω κώδικα, ώστε η συνάρτηση get() να μην διαβάζει ένα
χαρακτήρα την φορά αλλά ένα μπλόκ χαρακτήρων (π.χ. 512 bytes/χαρακτήρες). Χρησιμοποιήστε την
συνάρτηση ifstream::read(buf, bufsize) όπου buf είναι ένας πίνακας τύπου char, και το bufsize το
πλήθος των χαρακτήρων που θα διαβαστούν με την μια.

αυτο το ερωτημα πως θα το κανω;:hmm:
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
δηλαδή κάτι σαν κι αυτό :
Αντί του μπλοκ που διαβάζεις χαρακτήρα-χαρακτήρα.
Code:
{
   char buf[BUFSIZE];
   int  n;
   while ((n =  ifstream::read(0, buf, BUFSIZE)) > 0)    /* ανάγνωση από  το αρχείο σου, όπου BUFSIZE το μέγεθος που θες */
       ifstream::write( 1, buf, n);  /*εγγραφή στο stream εξόδου*/
   exit(0);
}
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
ευχαριστω θα το δοκιμασω στον κωδικα μου

#include<fstream>
#include<iostream>
using namespace std;
int main(int argc,char *argv[])
{
char buf[BUFSIZE];
int n;
if(argc!=3){
cout<<"Usage:CopyFile <from> <to>"<<endl;
return 0;
}

ifstream fin(argv[1]);
if(fin==0){
cout<<"Error: Input file cannot be opened for reading!"<<endl;
return 10;
}

ofstream fout(argv[2]);
if(fout==0){
cout<<"Error: Output file cannot be opened for writing!"<<endl;
return 10;
}

fin.seekg(0,ios::end);
size_t finsize=fin.tellg();
cout<<"Input file size: "<<finsize<<endl;

fin.seekg(0,ios::beg); // ios::beg -> from the start of the file
int c;
int percent=0;






while ((n = ifstream::read(0, buf, BUFSIZE)) > 0){ /* ανάγνωση από το αρχείο σου, όπου BUFSIZE το μέγεθος που θες */
ifstream::write( 1, buf, n); /*εγγραφή στο stream εξόδου*/
exit(0);


cout<<"Copy completed : "<<100*percent/finsize<<"\r";
percent++;
}
fin.close();
fout.close();
}

δηλαδη καπως ετσι θα ειναι ο κωδικας;
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Τελευταία επεξεργασία:

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
Ναι ουσιαστικά αλλάζει μόνο το κομμάτι στο οποίο διάβαζες χαρακτήρα-χαρακτήρα.
Τρέξε τον κώδικα για να δεις ότι είναι οκ γιατί δεν τον έχω δοκιμάσει.

Code:
#include<fstream>
#include<iostream>
using namespace std;
int main(int argc,char *argv[])
{
char buf[BUFSIZE];
int  n;
if(argc!=3){
            cout<<"Usage:CopyFile <from> <to>"<<endl;
            return 0;
            }
            
    ifstream fin(argv[1]);
    if(fin==0){
           cout<<"Error: Input file cannot be opened for reading!"<<endl;
           return 10;
           }
           
    ofstream fout(argv[2]);
    if(fout==0){
           cout<<"Error: Output file cannot be opened for writing!"<<endl;
           return 10;
           }
           
   fin.seekg(0,ios::end);
   size_t finsize=fin.tellg();
   cout<<"Input file size: "<<finsize<<endl;
   
   fin.seekg(0,ios::beg);  // ios::beg -> from the start of the file
   int c;
   int percent=0;
   

while ((n =  ifstream::read(0, buf, BUFSIZE)) > 0){    /* ανάγνωση από  το αρχείο σου, όπου BUFSIZE το μέγεθος που θες */
       ifstream::write( 1, buf, n);  /*εγγραφή στο stream εξόδου*/

             cout<<"Copy completed : "<<100*percent/finsize<<"\r";
             percent++;             
}
    fin.close();
    fout.close();                                                        
}
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
#include<fstream>
#include<iostream>
#define BUFSIZE 100
using namespace std;
int main(int argc,char *argv[])
{
char buf[BUFSIZE];
int n;
if(argc!=3){
cout<<"Usage:CopyFile <from> <to>"<<endl;
return 0;
}

ifstream fin(argv[1]);
if(fin==0){
cout<<"Error: Input file cannot be opened for reading!"<<endl;
return 10;
}

ofstream fout(argv[2]);
if(fout==0){
cout<<"Error: Output file cannot be opened for writing!"<<endl;
return 10;
}

fin.seekg(0,ios::end);
size_t finsize=fin.tellg();
cout<<"Input file size: "<<finsize<<endl;

fin.seekg(0,ios::beg); // ios::beg -> from the start of the file
int c;
int percent=0;


while ((n = ifstream::read(0, buf, BUFSIZE)) > 0){ /* áíÜãíùóç áðü ôï áñ÷åßï óïõ, üðïõ BUFSIZE ôï ìÝãåèïò ðïõ èåò */
ifstream::write(1,buf,n); /*åããñáöÞ óôï stream åîüäïõ*/

cout<<"Copy completed : "<<100*percent/finsize<<"\r";
percent++;
}
fin.close();
fout.close();
}

Εχω δηλωση το BUFSIZE σαν σταθερα δηλ. #define BUFSIZE 100

Οταν ομως κανω Compile(Dev-C++) μου βγάζει τα εξεις μυνηματα λαθους:

35 D:\Temp\TEI OF ATHENS_CS\Ä å÷\C++\PROGRAMS FOR C++ (ERGASTIRIO)\pr52\Untitled1.cpp no matching function for call to `std::basic_istream<char, std::char_traits<char> >::read(int, char[100], int)'

36 D:\Temp\TEI OF ATHENS_CS\Ä å÷\C++\PROGRAMS FOR C++ (ERGASTIRIO)\pr52\Untitled1.cpp `write' is not a member of `std::ifstream'
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
Το bold(τώρα ειναι το σωστο) πριν ήταν το λάθος.
H read επρεπε να καλεστει ως συναρτηση του fin.
Code:
#include<fstream>
#include<iostream>
#define BUFSIZE 100
using namespace std;
int main(int argc,char *argv[])
{
char buf[BUFSIZE];
int n;
if(argc!=3){
cout<<"Usage:CopyFile <from> <to>"<<endl;
return 0;
}

ifstream fin(argv[1]);
if(fin==0){
cout<<"Error: Input file cannot be opened for reading!"<<endl;
return 10;
}

ofstream fout(argv[2]);
if(fout==0){
cout<<"Error: Output file cannot be opened for writing!"<<endl;
return 10;
}

fin.seekg(0,ios::end);
size_t finsize=fin.tellg();
cout<<"Input file size: "<<finsize<<endl;

fin.seekg(0,ios::beg); // ios::beg -> from the start of the file
int c;
int percent=0;


while (( [B]fin.read( reinterpret_cast<char*>(buf), BUFSIZE))[/B] > 0){ 

cout<<"Copy completed : "<<100*percent/finsize<<"\r";
percent++;
}
fin.close();
fout.close();
}
Το compile το εκανα σε visual studio 2005.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
Ευχαριστω! Εκανα RUN το προγραμμα αλλα δεν μου αντιγραφη τα περιεχομενα του αρχειου.

δηλ. εστω οτι το αρχειο file1.txt εχει σαν δεδομενο την φραση hello world οταν στο command prompt δωσω την εντολη program2.cpp file1.txt file2.txt , στο αρχειο file2.txt δεν υπαρχουν τα περιεχομενα του file1.txt.

Ευχαριστω!
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
Ναι γιατι ελειπε η write που θα γραψει στο αρχειο εξόδου σου.:P

Code:
#include<fstream>
#include<iostream>
#define BUFSIZE 100
using namespace std;
int main(int argc,char *argv[])
{
char buf[BUFSIZE];
int n;
if(argc!=3){
cout<<"Usage:CopyFile <from> <to>"<<endl;
return 0;
}

ifstream fin(argv[1]);
if(fin==0){
cout<<"Error: Input file cannot be opened for reading!"<<endl;
return 10;
}

ofstream fout(argv[2]);
if(fout==0){
cout<<"Error: Output file cannot be opened for writing!"<<endl;
return 10;
}

fin.seekg(0,ios::end);
size_t finsize=fin.tellg();
cout<<"Input file size: "<<finsize<<endl;

fin.seekg(0,ios::beg); // ios::beg -> from the start of the file
int c;
int percent=0;


while (( fin.read( reinterpret_cast<char*>(buf), BUFSIZE)) > 0){ 
          [I]fout.write(reinterpret_cast<char*>(buf),n);[/I]

cout<<"Copy completed : "<<100*percent/finsize<<"\r";
percent++;
}
fin.close();
fout.close();
}
Το compile έγινε σε visual studio 2005.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
kαι παλι δεν αντιγραφη το αρχειο file1.txt
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
help bill
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
εστω οτι εχω τον παρακατω κωδικα

Code:
#include<fstream.h>
#include<iostream.h>

using namespace std;

int main(void)
{
    ofstream out_file;
    ifstream in_file;
    int i,j,sum;
    bool done;
    
    out_file.open("test.dat");
    for(i=1;i<4;i++){
      for(j=1;j<=4;j++)
          out_file<<4*(i-1)+j<<' ';
          cout<<endl;
          }
          
 out_file.close();
 
 in_file.open("test.dat");
 done=false;
 j=0;
 sum=0;
 do{
      in_file>>i;
       if(in_file.eof())done=true;
       else j++;
       if(j%3==0 && j>0){
                 sum+=i;
                 j=-1;
                 }
 }while (!done);
 in_file.close();
 cout<<sum<<endl;
 
 system("PAUSE");
}

αυτο που θελω να μου εξηγησει καποιος προς το παρον ειναι τι δουλεια κανει το in_file>>i;
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
Σου έκανε compile με τα header μαζί με το .h;

PHP:
#include<fstream>
#include<iostream>
Αυτό που κάνει η γραμμή που λες είναι να καταχωρεί από το αρχείο μια τιμή στη μεταβλητή i.


Το αρχείο αποκτάει τις τιμές από αυτό το κομμάτι κώδικα:

PHP:
  out_file.open("test.dat");
    for(i=1;i<4;i++){
      for(j=1;j<=4;j++)
          out_file<<4*(i-1)+j<<' ';
          cout<<endl;
          }
          
 out_file.close();
Αυτό βάζει τις τιμές
Code:
1 2 3 4 5 6 7 8 9 10 11 12
στο αρχείο.

Έτσι σε κάθε loop που συναντάει το in_file>>i καταχωρεί την επόμενη τιμή στο i από το αρχείο και συνεχίζει με την εκτέλεση των υπόλοιπων εντολών.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
ναι μου εκανε κανονικα την μεταγλαττιση του κωδικα απλα μου εβγαλε και καποιο worning

τελος σπαντον

αυτο που θες να πεις ειναι οτι πτωτα στην μεταβλητη i θα αποθηκευτη ο αριθμος 1 μετα ο 2 κοκ.

κατι αλλο τωρα η εξοδος στην οθονη οσων αφορα για την μεταβλητη sum ειναι 21 (1+2+3+4+5+6=21) . γιατι παιρνει τα 6 πρωτα?


στην πρωτη εκτελεση της do while η μεταβλητη j γινεται 1 και μετα 0 κοκ? εχω μπερδευτη λιγακι εως πολυ αν και ειναι απλο παραδειγμα :redface:
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
Οι τιμές του i που αθροίζονται ειναι 3,7 και 11.

To j αυξάνεται κατά ένα μέχρι να γίνει 3.Τότε θα γίνει η πρώτη άθροιση και το j θα πάρει την τιμή -1.
Aυξάνει πάλι κατά ένα μέχρι να ξαναγίνει 3 για να ξαναμπεί στο if , όπου στο sum θα προστεθεί το 7.Ομοίως και για το 11.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
οκ κατανοητο :) να σε καλα
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Χρήστες Βρείτε παρόμοια

  • Τα παρακάτω 0 μέλη και 1 επισκέπτες διαβάζουν μαζί με εσάς αυτό το θέμα:
    Tα παρακάτω 1 μέλη διάβασαν αυτό το θέμα:
  • Φορτώνει...
Top