|
| ofstream /ifstream -variabel?? Fra : Anders Jensen |
Dato : 25-02-01 12:39 |
|
Jeg har tidligere lænet mig op af gruppens overbærenhed m.h.t til
delitantiske spørgsmål -Så jeg tillader mig at spørge
Jeg arbejder med et program ( i VC++6.0 ) der behandler et antal af
programmet ukendte filer. - Hvilket ikke giver problemer.
Problemet består i, at man ( tilsyneladende ) ikke kan genbruge
ophægtningen på ifstream ell/og ofstream
Derved kommer jeg til, at mangle, at gøre ( i dette tilfælde ) ophægtningen
variabel
eks: ofstream varibel_fil(nr,ios::trunc);
Kan ophægtningen genbruges eller kan variabel_fil gøres variabel - Nogen
forslag ??
NUN
LINUS
linus@post2.tele.dk
| |
Igor V. Rafienko (25-02-2001)
| Kommentar Fra : Igor V. Rafienko |
Dato : 25-02-01 13:32 |
|
* Anders Jensen
> Jeg arbejder med et program ( i VC++6.0 ) der behandler et antal af
> programmet ukendte filer. - Hvilket ikke giver problemer. Problemet
> består i, at man ( tilsyneladende ) ikke kan genbruge ophægtningen
> på ifstream ell/og ofstream
Mulig dette er et av de tilfellene der norsk og dansk er vesentlig
forskjellige, men hva mener du med "genbruge ophægtningen på ifstrem"?
Vil du ved hjelp av en [i|o]fstream variabel kunne aksessere flere
filer etter hverandre?
> Derved kommer jeg til, at mangle, at gøre ( i dette tilfælde )
> ophægtningen variabel
>
> eks: ofstream varibel_fil(nr,ios::trunc);
>
> Kan ophægtningen genbruges eller kan variabel_fil gøres variabel -
> Nogen forslag ??
Med forbehold om at jeg forstoid deg riktig:
Ja, du kan la en [i|o]stream variabel være forbundet med forskjellige
filer (så lenge det ikke skjer samtidig):
$ cat baz.cpp
#include <fstream>
#include <algorithm>
int
main( int argc, char *argv[] )
{
using namespace std;
ifstream ifs;
while ( *++argv ) {
ifs.open( *argv );
cout << ifs.rdbuf();
ifs.close();
}
}
$ g++ baz.cpp
$ cat data*
foo
bar
baz
zot
$ ./a.out data*
foo
bar
baz
zot
$
BTW, koden over har elendig feilhåndtering, men den burde være en
pekepinne (med forbehold om at jeg svarte på det du spurte etter).
ivr
--
Besides, meat tends to run away when possible, or fights. Either
response presents behavioral challenges too complex for any existing
robot.
-- Stuart Wilkinson, inventor of the "gastrobot"
| |
Anders Jensen (26-02-2001)
| Kommentar Fra : Anders Jensen |
Dato : 26-02-01 11:47 |
|
Takker for svar
> Mulig dette er et av de tilfellene der norsk og dansk er vesentlig
forskjellige
genbruge ophægtningen på ifstrem = Genbruge den syntaks der i dette tilfælde
er knyttet til ifstream ( dvs variabel_fil )
Jeg er ikke helt sikker på, at ordet ophægtning er korrekt dansk, men det
følger strukturen
at knytte til = at tilknytte
at spole frem (til) = at fremspole (til)
at hægte op (på) = at ophægte (på)
at virke på = at påvirke
> Ja, du kan la en [i|o]stream variabel være forbundet med forskjellige
filer (så lenge det ikke skjer samtidig):
Hm..Jeg er kommet til den konklusion, at der så må være en fejl i min VC++
6.0. - Den akcepterer
ikke følgende ( Der kommer en redefinitionsfejl )
strcpy(nr,"Sprout000.dat");
ofstream variabel_fil(nr,ios::trunc);
close variabel_fil;
strcpy(nr,"Sprout011.dat");
ofstream variabel_fil(nr,ios::trunc);
close variabel_fil;
( Det var årsagen til, at jeg ønskede, at ændre variabel_fil til en
variabel )
Derimod aksepterer den
y=0;strcpy(nr,"Sprout000.dat");
while (y<2){y++;
ofstream sprout_fil(nr,ios::trunc);strcpy(nr,"Sprout011.dat");}
NUN
LINUS
linus@post2.tele.dk
| |
Igor V. Rafienko (26-02-2001)
| Kommentar Fra : Igor V. Rafienko |
Dato : 26-02-01 13:14 |
|
* Anders Jensen
[snip]
> > Ja, du kan la en [i|o]stream variabel være forbundet med
> > forskjellige filer (så lenge det ikke skjer samtidig):
>
> Hm..Jeg er kommet til den konklusion, at der så må være en fejl i min VC++
> 6.0. - Den akcepterer
> ikke følgende ( Der kommer en redefinitionsfejl )
>
> strcpy(nr,"Sprout000.dat");
> ofstream variabel_fil(nr,ios::trunc);
> close variabel_fil;
Huh? Det _skal_ være
variabel_fil.close();
(IOW, close er en member function).
> strcpy(nr,"Sprout011.dat");
> ofstream variabel_fil(nr,ios::trunc);
Dette vil ikke fungere fordi du definerer/deklarerer den samme
variabelen 2 ganger i samme skop (bedre kjent som "one-definition
rule"). Hvis du vil bruke den _samme_ syntaksen, foreslår jeg at du
følger Mogens sin råd og introduserer en ekstra blokk, der du
oppretter en ny variabel_fil for hver gang kontrollen går gjennom
blokken. Det er naturligvis like greit å deklarere/definere
'variabel_fil' bare en gang og så bruke open()/close()/is_open() (slik
jeg eller Mogens har demonstrert).
> close variabel_fil;
> ( Det var årsagen til, at jeg ønskede, at ændre variabel_fil til en
> variabel )
Hvis du vil knytte 'variabel_fil' til flere filer _i den samme
blokken_ bruk heller open/close.
> Derimod aksepterer den
>
> y=0;strcpy(nr,"Sprout000.dat");
> while (y<2){y++;
> ofstream sprout_fil(nr,ios::trunc);strcpy(nr,"Sprout011.dat");}
Naturligvis blir dette akseptert, da while introduserer en ny blokk.
VC++ ser ut til å oppføre seg helt korrekt i dette tilfellet.
ivr
PS: jo før du slutter å bruke char*'ere, desto enklere blir livet
ditt. strcpy() er _helt_ unødvendig i koden over.
--
Besides, meat tends to run away when possible, or fights. Either
response presents behavioral challenges too complex for any existing
robot.
-- Stuart Wilkinson, inventor of the "gastrobot"
| |
Mogens Hansen (25-02-2001)
| Kommentar Fra : Mogens Hansen |
Dato : 25-02-01 14:03 |
|
Hej Anders,
"Anders Jensen" <linus@post2.tele.dk> wrote in message
news:97ar3b$ark$1@news.inet.tele.dk...
> Jeg har tidligere lænet mig op af gruppens overbærenhed m.h.t til
> delitantiske spørgsmål -Så jeg tillader mig at spørge
>
> Jeg arbejder med et program ( i VC++6.0 ) der behandler et antal af
> programmet ukendte filer. - Hvilket ikke giver problemer.
> Problemet består i, at man ( tilsyneladende ) ikke kan genbruge
> ophægtningen på ifstream ell/og ofstream
>
> Derved kommer jeg til, at mangle, at gøre ( i dette tilfælde )
ophægtningen
> variabel
>
> eks: ofstream varibel_fil(nr,ios::trunc);
>
> Kan ophægtningen genbruges eller kan variabel_fil gøres variabel - Nogen
> forslag ??
>
Hvis jeg har forstået dit spørgsmål rigtigt, vil du gerne kunne bruge din
variabel til først at åbne een fil, og derefter en anden:
Jeg har to bud på en løsning:
1: brug funktionerne "is_open", "close" og "open"
2: lad det blive styret af scope af variablen
Jeg foretrækker umiddelbart løsning nr. 2.
De to løsninger er vist nedenfor:
#include <fstream>
using namespace std;
const char* FILES[] = { ... };
void func1(void)
{
ifstream is;
for(size_t i = 0; sizeof(FILES)/sizeof(FILES[0]) != i; ++i) {
// rebind
if(is.is_open()) {
is.close();
}
is.open(FILES[i]);
// Use the file
if(is) {
// ...
}
}
}
void func2(void)
{
for(size_t i = 0; sizeof(FILES)/sizeof(FILES[0]) != i; ++i) {
ifstream is(FILES[0]);
// Use the file
if(is) {
// ...
}
}
}
int main(void)
{
func1();
func2();
return 0;
}
Venlig hilsen
Mogens Hansen
| |
Anders Jensen (26-02-2001)
| Kommentar Fra : Anders Jensen |
Dato : 26-02-01 11:46 |
|
Tak - det ser rigtigt ud - Det må jeg straks afprøve
--
NUN
LINUS
linus@post2.tele.dk
| |
|
|