Nome file

di il
13 risposte

Nome file

Salve a tutti
ho un problema che per chi ne capisce più di me sara semplicissimo metre per me è un colosso ho guardato anche molte dispense ma non ho trovato soluzione.
il problema e il seguente devo:
devo affibiare un nome ad un file ma non in maniera costante
#include <iostream>
#include <fstream>
using namespace std;

int main () {
ofstream nomefile;
  nomefile.open ("example.txt",ios::out | ios::app | ios::binary)
; adesso al posto della stringa "example.txt" vorrei mettere una variabile ma mi da errore di conversione.

13 Risposte

  • Re: Nome file

    Ciao smalldragon,
    non sono sicuro di avere capito, intendi qualcosa del genere?:
    
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main () 
    {
       ofstream nomefile;
       string fileName = "example.txt";
       nomefile.open(fileName, ios::out | ios::app | ios::binary);
       nomefile << "ciao";
       nomefile.close();
       return 0;
    }
    
  • Re: Nome file

    Ciao barba, open vuole un const char non so se esiste qualche implementazione che supporti lo string, quindi
    
    ofstream nomefile;
       string fileName = "example.txt";
       nomefile.open(fileName.c_str(), ios::out | ios::app | ios::binary);
    
  • Re: Nome file

    Ciao skynet
    Pure io mi ricordavo cosi, infatti stavo per scrivere .c_str(), poi il compilatore mi ha dato l' ok e allora ho pensato che avesse ragione lui. Nel VisualStudio l' intellisense ti propone in overload anche la versione con lo string e lo compila.
  • Re: Nome file

    Vero visto adesso, l'hanno aggiunto nel C++11
  • Re: Nome file

    Dovrebbe essere questa la soluzione grazie
    scusate la domanda
    ma le variabili string le posso trattare come le char oppure per modificarle devo usare qualche funzione che sicuramente non conosco?
    come ben si vede in c++ sono un pò scarsino
  • Re: Nome file

    Sono decisamente più comode dei char*, ad esempio:
    
    	string a = "ciao";
    	string b = " a tutti";
    	string c = a + b;
    
    comunque guarda qui che ci sono numerosi esempi:
  • Re: Nome file

    Comodo questo fatto ma se io volessi cambiare uno o più caratteri della stringa come faccio?
    esempio:
    string a = "ciao";
    stringa da modificare in "miao"
  • Re: Nome file

    
    	string s = "ciao";
    	s[0] = 'm';
    	cout << s;
    
    Scriverà miao. La classe string ha molti metodi, fa un salto al link che ti ho dato e te ne farai un' idea.
  • Re: Nome file

    Allora se posso usare anche l'indirizzamento di ogni singolo carattere e molto meglio della char.
    grazie di nuovo.
    prima che ricevessi la tua risposta sopra hai file e guardando delle altre dispense avevo fatto questo cioè avevo provato ad aprire il file utilizzando gli handle.
    volevo sapere a parte la semplicità del tuo metodo con quale sistema e meglio gestire i file.
    con gli handle o con gli stream?
    #include "stdafx.h"
    #include <iostream>
    #include "windows.h"
    #include <string.h>
    using std::cout;
    using std::cin;
    using std::endl;
    int aprifile(const char*,const char*,const char*,int,const char*,const char*,int);
    int _tmain(int argc, _TCHAR* argv[])
       {
    	char nomefile[17] = "a:/esercizio.txt";
    	char nomefile1[18] = "a:/esercizio2.txt";
    	// definizione campi per chiamata file
    	char f1[13] = "GENERIC_READ";
    	char f2[16] = "FILE_SHARE_READ";
    	char f3[14] = "OPEN_EXISTING";
    	char f4[22] = "FILE_ATTRIBUTE_NORMAL";
    	int handle;
        int nlinea=0;
    	handle = aprifile(nomefile,f1,f2,nlinea,f3,f4,nlinea);
    	if (handle <= 0)
    	  {
    		  cout << "problemi nella apertura del file " << handle; 
    		  return -1;
    	  }
        //CloseHandle (handle);
    	return 0;
       }
    // area adibita alle funzioni
    
    int aprifile(char *nomefile, char *f1, char *f2, int nlinea1, char *f3, char *f4, int nlinea2);
       //{	
         hfile1 = 
    		 CreateFile (*nomefile,*f1,*f2,nlinea,*f3,*f4,nlinea);
    	 if ( hfile1 == INVALID_HANDLE_VALUE)
    	   { 
    		Cout << "ERRORE NELL' ATTRIBUZIONE DEL HANDLE";
    		return (-1);
    	   }
    	 cout << hfile1;
    	return hfile1;
       }
    
    p.s. naturalmente il programma qui proposto non funziona perchè ci sono errori di conversione dei dati. ma come esempio credo che sia calzante.
  • Re: Nome file

    Gli stream sono assolutamente più comodi.
  • Re: Nome file

    Quindi se ho capito bene gli stream sono solamente più comodi.
    chi gestisce più errori gli handle o gli stream?
    per favore mi potresti fare un esempio di gestione degli errori dei file nella modalità stream?
    cosi posso capire le differenze tra i due sistemi.
    visto che proverò ad utilizzare la tua definizione di variabile all'interno del programma degli handle sperando che cosi si risolva il problema di compatibilità dei dati.
    grazie in anticipo
  • Re: Nome file

    smalldragon ha scritto:


    quindi se ho capito bene gli stream sono solamente più comodi.
    Se intendi dire che non sei obbligato a usarli hai perfettamente ragione.

    Per quanto riguarda la gestione degli errori Il discorso è un po lunghetto per cui ti rimando al link di prima, giusto per dirti qualcosa, gli errori negli stream possono essere gestiti in diversi modi, o testando i flag di fail:
    
    	ifstream f;
    	f.open("fileCheNonEsiste.txt");
    	if (f.fail)
    	    ....
    
    oppure abilitando la gestione delle eccezioni:
    
    	ifstream f;
    	f.exceptions(ifstream::failbit | ifstream::badbit);
    	f.open("fileCheNonEsiste.txt");
    
    e da qualche parte metti il blocco try/catch.
  • Re: Nome file

    Vedrò di studiarmi bene sia il link che i tuoi esempi grazie di tutto
    anche se non centra con l'argomento
    erano cosi comodi e semplici gli interrupt assempler!
    mi sa mi sa che levando di mezzo l'assembler al posto di semplificare la programmazione l'hanno complicata!
Devi accedere o registrarti per scrivere nel forum
13 risposte