THMMY.gr

Ηλεκτρονικοί Υπολογιστές και Τεχνικά Θέματα => C / C++ / C# => Topic started by: marauber on March 12, 2008, 17:21:55 pm



Title: Δημιουργία μεταβλητών αρχείων στη C++
Post by: marauber on March 12, 2008, 17:21:55 pm
Καλησπέρα παίδες. Θέλω να δημιουργήσω αρχεία με ονόματα που προκύπτουν από κάποιες μεταβλητές, πχ testi όπου i=1 ή ί=2, ώστε να δημιουργηθούν τα αρχεία test1 και test2.

Έχω στο μυαλό μου κάτι του στυλ:

for (int i=1;i<4;i++)
   {
      ofstream teststream("test"+i);
      teststream<<"testing";
   }

αλλά τα αρχεία δε δημιουργούνται με τα ονόματα που αναμένω (δημιουργούνται τα est, st και t κόβοντας χαρακτήρες από το test). Καμία ιδέα;

Και αν καταφέρω αυτό, να βρω τρόπο να προσθέτω strings στο όνομα του αρχείου κατά βούληση με βάση λογικές πράξεις.


Title: Re: Δημιουργία μεταβλητών αρχείων στη C++
Post by: Aurelius on March 12, 2008, 17:36:08 pm
Ναι γιατι με αυτο που κανει ειναι σαν να του λες να δωσει το ονομα απο το 1, 2, 3 ... χαρακτηρα του string που ειναι στην ουσια πινακας. Αυτο που πρεπει να κανεις ειναι το εξης:

Μετατρεπεις το i πρωτα σε char με τις συναρτησεις itoa ή atoi και μετα ενωνεις τα 2 strings.

Δηλ.

for (int i=1;i<4;i++)
   {
      ofstream teststream((string)("test"+itoa(i)));
      teststream<<"testing";
   }

Λογικα ετσι θα δουλεψει.


Title: Re: Δημιουργία μεταβλητών αρχείων στη C++
Post by: marauber on March 12, 2008, 18:04:21 pm
Μου βγάζει σφάλμα στην itoa, `itoa' was not declared in this scope, παρόλο που έκανα #include <cstdlib>. Επίσης δοκίμασα και το εξής:


string b;
b="Test2";
ofstream teststream((string)("test"+b));
teststream<<"testing";

το οποίο πάλι δε δουλεύει "error: no matching function for call to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../include/c++/3.4.6/iosfwd:93: note: candidates are: std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(const std::basic_ofstream<char, std::char_traits<char> >&)
"


Title: Re: Δημιουργία μεταβλητών αρχείων στη C++
Post by: Aurelius on March 12, 2008, 18:23:47 pm
Δοκιμασε

char ch[10];
int i = 1234;
sprintf( ch,"%d", i);

απο http://www.codeguru.com/forum/archive/index.php/t-179488.html

Γενικα google int to char c++


Title: deleted
Post by: BOBoMASTORAS on March 12, 2008, 18:43:52 pm
deleted


Title: Re: Δημιουργία μεταβλητών αρχείων στη C++
Post by: marauber on March 12, 2008, 19:03:15 pm
Thanks Bob, δούλεψε. Μόνο μια μικρή λεπτομέρεια:

Πως γίνεται να αδειάσω το stringstream; Γιατί μέσα σε βρόγχο for εκτός από το τρέχον όνομα αρχείου βγάζει και τα προηγούμενα που είχαν μπει σε αυτό

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;


int main( int argc, char * argv[ ] )
{
   int i;
   stringstream filename;
   for (i=i;i<4;i++)
   {
      filename<<"test"<<i;
      ofstream teststream(filename.str().c_str());
      teststream<<"testing";
   }
   return 0;
}

Πολύ σπάσιμο πάντως που η ofstream.open δε δέχεται σαν είσοδο string.


Title: deleted
Post by: BOBoMASTORAS on March 12, 2008, 19:05:54 pm
deleted


Title: Re: Δημιουργία μεταβλητών αρχείων στη C++
Post by: marauber on March 12, 2008, 19:15:10 pm
Thanks, βρήκα το filename.str(string()); και δουλεύει. Λογικά και τo δικό σου. Στο http://www.thescripts.com/forum/thread60377.html το βρήκα, το cplusplus δεν είχε κάτι.


Title: Re: Δημιουργία μεταβλητών αρχείων στη C++
Post by: Καμένος on March 14, 2008, 12:52:04 pm
Επίσης στον πρώτο κώδικα μπορείς να βάλεις στη θέση του i το (i+48). Αυτό γιατί αν προσθέσεις σε string το i θα το πάρει ώς char. Αν το i=0 προσθέτει τον χαρακτήρα που έχει ASCII το 0..


Title: Re: Δημιουργία μεταβλητών αρχείων στη C++
Post by: Aurelius on March 14, 2008, 13:33:37 pm
Δοκιμασε

char ch[10];
int i = 1234;
sprintf( ch,"%d", i);

απο http://www.codeguru.com/forum/archive/index.php/t-179488.html

Γενικα google int to char c++

Παντως αυτο το δοκιμασα και δουλεψε.


Title: Re: Δημιουργία μεταβλητών αρχείων στη C++
Post by: marauber on March 14, 2008, 18:22:50 pm
Ευχαριστώ άπαντες, αλλά τελικά με βόλεψε πολύ το stringstream και δεν το αλλάζω τώρα :P