/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Problemer med at læse fra fil to gange
Fra : Peter Skjelbo, eaid.~


Dato : 25-03-03 18:51

Hej,

Så er den gal igen med VC++ 6.0 - og min kunnen... Jeg har et program der
skriver og læser til en logfil. Jeg kan læse fra logfilen een gang,
hvorefter systemet reagerer på fail(). Jeg går ud fra at jeg mangler en
close et sted, men synes jeg har forsøgt mange muligheder, incl.
groups.google.com.
Kun den nødvendige funktion samt o- og ifstream er indsat.

ofstream fil1;
ifstream file ("log.txt");

void show_log(){
bool continue = true;
system("cls");
int i;
if (file.fail())
{
cout<<"\n\n*** Fejl: Der er ikke oprettet en log-fil ***\n\n";
} else {
char buffer[200];
while (! file.eof() && continue)
{
cout<<"\n\nDato\t\tTid\t\tEtage\tBelastning [g]";
for (i=0;i<20;i++)
{
file.getline (buffer,100);
cout<<"\n"<<buffer;
if (file.eof())
i=20;
}
cout<<"\nTryk på en vilkårlig tast for at fortsætte eller x
for at afslutte"<<endl;
while (!kbhit()){
//Wait
}
char noop = getch();
if (noop=='x'|| noop=='X')
continue = false;
}
}
file.close();
}

Hvis Bertal og Thø læser med, så tak for svarene tidligere på dagen :)

-Peter

--
Upload billeder, musik og java-programmer til din mobiltelefon GRATIS på:
www.eaid.dk/mobil.php?action=upload



 
 
Bertel Brander (25-03-2003)
Kommentar
Fra : Bertel Brander


Dato : 25-03-03 20:42

Peter Skjelbo, eaid.dk skrev:
> Hej,
>
> Så er den gal igen med VC++ 6.0 - og min kunnen... Jeg har et program der
> skriver og læser til en logfil. Jeg kan læse fra logfilen een gang,
> hvorefter systemet reagerer på fail(). Jeg går ud fra at jeg mangler en
> close et sted, men synes jeg har forsøgt mange muligheder, incl.
> groups.google.com.
> Kun den nødvendige funktion samt o- og ifstream er indsat.
>
> ofstream fil1;
> ifstream file ("log.txt");
>
> void show_log(){
> bool continue = true;
> system("cls");
> int i;
> if (file.fail())
> {
> cout<<"\n\n*** Fejl: Der er ikke oprettet en log-fil ***\n\n";
> } else {
> char buffer[200];
> while (! file.eof() && continue)
> {
> cout<<"\n\nDato\t\tTid\t\tEtage\tBelastning [g]";
> for (i=0;i<20;i++)
> {
> file.getline (buffer,100);
> cout<<"\n"<<buffer;
> if (file.eof())
> i=20;
> }
> cout<<"\nTryk på en vilkårlig tast for at fortsætte eller x
> for at afslutte"<<endl;
> while (!kbhit()){
> //Wait
> }
> char noop = getch();
> if (noop=='x'|| noop=='X')
> continue = false;
> }
> }
> file.close();
> }

Du kan ikke læse fra filen efter at du har lukket (file.close()) den.
Så jeg vil forelså at du åbner (file.open("log.dat")) filen i starten
af funktionen & lukker den i slutningen af funktionen.
Som det er nu åbnes filen nå programmet starter, og den bliver lukket
første gang programmet kører, næste gang funktionen kaldes er filen
ikke åben så du kan ikke læse fra den.

/bertel

--
Bertel Brander, author of Wain, a free texteditor for programmers:
http://home20.inet.tele.dk/midgaard/program.htm




Bertel Lund Hansen (25-03-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 25-03-03 20:46

Peter Skjelbo, eaid.dk skrev:

>Så er den gal igen med VC++ 6.0 - og min kunnen...

Du bruger "continue" som variabel, men det er et reserveret ord.
Brug f.eks. "cont" i stedet. Hvis jeg er i mit 'morsomme' hjørne,
bruger jeg "goon" (go on).

>Jeg har et program der
>skriver og læser til en logfil. Jeg kan læse fra logfilen een gang,
>hvorefter systemet reagerer på fail().

Nej. Det reagerer på file.eof() som er true hvorfor rutinen
afbrydes. Du skal have en kommando som nulstiller filen hvis du
vil kunne læse den flere gange i træk. Skema:

   while (cont)
      læs og skriv;
      file.seekg(0); // Virker ikke ved 20 linjer
            men kun ved højst 18.
      cont=getch!='x'; // 0x1B svarer i øvrigt til Esc.
//      cont=getch!=27; // svarer til Esc.
   }
   file.close;


Fif:
Lav din forløkke sådan her:

for (i=0; i<20 && !file.eof(); i++) {

Så er det tydeligere at den terminerer efter 20 linjer eller ved
udtømt fil, og du kan spare den linje der (måske) sætter i til
20.

Din file.close() aktiveres uanset om filen eksisterer eller ej,
men det sker der ikke noget ved så den står godt nok.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Peter Skjelbo, eaid.~ (26-03-2003)
Kommentar
Fra : Peter Skjelbo, eaid.~


Dato : 26-03-03 18:55

"Bertel Lund Hansen" <nospamfor@lundhansen.dk> skrev i en meddelelse
news:mha18vsoq9ttqet3jre0unr7t03s1h47c4@news.stofanet.dk...
> >Jeg har et program der
> >skriver og læser til en logfil. Jeg kan læse fra logfilen een gang,
> >hvorefter systemet reagerer på fail().
>
> Nej. Det reagerer på file.eof() som er true hvorfor rutinen
> afbrydes. Du skal have en kommando som nulstiller filen hvis du
> vil kunne læse den flere gange i træk. Skema:
>
> while (cont)
> læs og skriv;
> file.seekg(0); // Virker ikke ved 20 linjer
> men kun ved højst 18.
> cont=getch!='x'; // 0x1B svarer i øvrigt til Esc.
> // cont=getch!=27; // svarer til Esc.
> }
> file.close;

Jeg har afprøvet din (og det andet indlæg)'s ide, men kan stadig ikke få
skidtet op at køre. Der er stadig de samme problemer, at den melder at filen
fail'er... Læg mærke til mine kommentarer, og på forhånd tak :) Jeg er ikke
helt nogen haj til c/c++-programmering, men jeg er vant til php, der godt
nok minder om c, men hvor alt er lidt simplere, efter min mening ;)

void show_log(){
bool goon = true;
system("cls");
int i;
if (file.fail()){
cout<<"\n\n*** Fejl: Der er ikke oprettet en log-fil ***\n\n";//Her når
den til anden gang funktionen kaldes
} else {
char buffer[200];
while (goon && !file.eof())
{
cout<<"\n\nDato\t\tTid\t\tEtage\tBelastning [g]";
for (i=0;i<18 && !file.eof();i++)
{
file.getline (buffer,100);
cout<<"\n"<<buffer;
}
file.seekg(0);//Er denne indsat det korrekte sted?
cout<<"\nTryk på en vilkårlig tast for at fortsætte eller x for at
afslutte"<<endl;
while (!kbhit()){
//Wait
}
//goon = getch!='x';// Det her vil den ikke være med til - se fejl længst
nede
}
}
file.close();
}

Fejl, når jeg fjerne // ved goon = getch!='x'

C:\Programmer\Microsoft Visual Studio\MyProjects\Elevator\control.cpp(94) :
error C2446: '!=' : no conversion from 'int' to 'int (__cdecl *)(void)'
Conversion from integral type to pointer type requires
reinterpret_cast, C-style cast or function-style cast
C:\Programmer\Microsoft Visual Studio\MyProjects\Elevator\control.cpp(94) :
error C2040: '!=' : 'int (__cdecl *)(void)' differs in levels of indirection
from 'int'
Error executing cl.exe.



Kent Friis (26-03-2003)
Kommentar
Fra : Kent Friis


Dato : 26-03-03 18:58

Den Wed, 26 Mar 2003 18:55:22 +0100 skrev Peter Skjelbo, eaid.dk:
> //goon = getch!='x';// Det her vil den ikke være med til - se fejl længst
>Fejl, når jeg fjerne // ved goon = getch!='x'

Det skal være getch()

Mvh
Kent
--
The frozen north will hatch a flightless bird,
who will spread his wings and dominate the earth
And cause an empire by the sea to fall
To the astonishment, and delight of all.

Peter Skjelbo, eaid.~ (26-03-2003)
Kommentar
Fra : Peter Skjelbo, eaid.~


Dato : 26-03-03 19:04


"Kent Friis" <leeloo@phreaker.net> skrev i en meddelelse
news:b5spmc$8kd$1@sunsite.dk...
> Den Wed, 26 Mar 2003 18:55:22 +0100 skrev Peter Skjelbo, eaid.dk:
> > //goon = getch!='x';// Det her vil den ikke være med til - se fejl
længst
> >Fejl, når jeg fjerne // ved goon = getch!='x'
>
> Det skal være getch()
Ja, selvfølgelig - tak, det var så ét problem mindre ;)

-Peter



Peter Skjelbo, eaid.~ (26-03-2003)
Kommentar
Fra : Peter Skjelbo, eaid.~


Dato : 26-03-03 19:36


"Peter Skjelbo, eaid.dk" <peter@VÆKeaid.dk> skrev i en meddelelse
news:3e809720$0$52129$edfadb0f@dread16.news.tele.dk...
> Hej,


Har løst det - det hjalp at flytte ifstream file ("log.txt"); ind i
funktionen. Tak for hjælpen :)

-Peter

--
Upload billeder, musik og java-programmer til din mobiltelefon GRATIS på:
www.eaid.dk/mobil.php?action=upload



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste