Newsgroup: it.comp.lang.c++
Titolo: Aprire sequenza di file

Devo leggere da file una sequenza di immagini pgm poste in una certa 
cartella e chiamate unicamente con un numero da 1 a 300 (senza zeri in cima)
void immagine3d::carica(const string & percorso = "default")
{
     string nomefile;
     for(int n = 1; n <= 300; n++)
     {
         // Costruisco il nome del file concatenando il percorso con
         // il parametro
         nomefile = percorso;
         nomefile += "\\";
     	nomefile += n;
     	// Apro il file
         FILE* f_in;
     	f_in = fopen(nomefile.c_str(), "rb");
     	if (f_in == NULL)
             errore("file non trovato");
Mi fermo qui perche' qui c'e' la magagna: la funzione non trova il primo 
file, da' errore ed esce. Appurato che la cartella "default" esiste, e' 
contenuta nella stessa directory del mio eseguibile e contiene quei file 
che devo aprire, dove sta l'errore?

 
Sei in C++, perché non usare le funzioni del C++? Inoltre ti manca
l'estensione da concatenare alla stringa dopo al numero.
-- 
Matteo Settenvini
FSF Associated Member
Email : 
mat...@member.fsf.org
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d--(-) s+:- a-- C++ UL+++
P?>++ L+++>$ E+>+++ W+++ N++ o?
w--- O- M++ PS++ PE- Y+>++
PGP+++ t+ 5 X- R tv-- b+++ DI+
D++ G++ e h+ r-- y?
------END GEEK CODE BLOCK------

 che devo aprire, dove sta l'errore?
un errore sicuramente sta nella riga:
nomefile += n;
se non sei convinto prova a stampare su schermo il nome del file che
stai cercando di aprire ;-)
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 stai cercando di aprire ;-)
Lol, mi appare una faccina sorridente al posto del numero!
Pensavo si potessero concatenare interi nelle stringhe, uffa. Tra 
l'altro ho provato a convertire l'intero con itoa() ma il compilatore 
non vede la funzione nonostante abbia incluso la stdlib.
Quindi ho risolto cosi'...
ostringstream nomefile;
nomefile << percorso << "\\" << n;
string temp = nomefile.srt();
FILE* f_in;
f_in = fopen(temp.c_str(), "rb");
In effetti fa parecchio schifo. Pero' funge ^_^'
-- 
www.project-ring.com

 Sei in C++, perché non usare le funzioni del C++? 
Perche' sono partito da codice gia' presente.
 > Inoltre ti manca
 > l'estensione da concatenare alla stringa dopo al numero.
Si' le estensioni mancano anche nei file che devo aprire.
-- 
www.project-ring.com

 nomefile << percorso << "\\" << n;
Non ho ancora iniziato a usare le stringstream, pero' a occhio direi che 
se n e' un intero e ostringstream::operator<<(int) e' definito proprio 
come penso, tu stai aggiungendo alla stringa un carattere il cui valore 
e' n. Poi ascii specifica che a quel valore corrisponda la faccina 
sorridente. Prova a fare nomefile<<n+'0'.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

DevarajA ha scritto:

Anzi: ascii specifica che quello sia un carattere di controllo, e' il 
font che usi che lo fa corrispondere a una faccina. Se il resto e' 
giusto pero' non lo so.


 sorridente. Prova a fare nomefile<<n+'0'.
Ma cosi' facendo non avrei lo stesso problemi allorquando n diventa di 
due cifre? Comunque ho testato la versione 'rattoppata' con la 
stringstream e funziona.
-- 
www.project-ring.com

Il Vampiro Casimiro ha scritto:

Si, rattoppata e' la parola giusta :-). Si potrebbe usare sprintf, 
dichiarata in cstdio. Restando in c++ vero e proprio non saprei..


 In effetti fa parecchio schifo. Pero' funge ^_^'
Se non altro e' una soluzione molto piu' sicura di tante altre.
Ciao,
Nicola

 sorridente. Prova a fare nomefile<<n+'0'.
No. ostream::operator<<(int) sfrutta le informazioni fornite dall'oggetto 
locale associato per scrivere l'intero in forma testuale.
In pratica, in condizioni normali, corrisponde al "%d" dell'sprintf
Quindi ciò che scriverà sarà quello che l'OP intendeva fare.
Ciao
Gianluca Silvestri

 sorridente. Prova a fare nomefile<<n+'0'.
Suggerimento: secondo te cosa fa il seguente programmino?
#include <iostream>
#include <ostream>
int main()
{
  int n = 42;
  std::cout << n << '\n';
}
********** SPOILER **********
Seconda domanda: secondo te che probabilita' c'e' che
std::ostream::operator<< (int) si comporti in modo diverso da
std::ostringstream::operator<< (int) ?
Ciao,
Nicola

 sorridente. Prova a fare nomefile<<n+'0'.
uh?! e se n e' 4863 il +'0' a cosa ti serve?


 Sei in C++, perché non usare le funzioni del C++?
Potrebbe essere che deve in qualche modo usare all'interno delle 
funzioni chiamate a roba C o simile che non sanno bene come gestire gli 
stream. 
Peraltro che io sappia non esiste un modo standard per ottenere il 
descrittore di file a partire da uno fstream. E mi pare anche logico, 
btw.
-riko