webForumDet fria alternativet

Läsa textfiler och starta program

14 svar · 935 visningar · startad av puhbjörn

puhbjörnMedlem sedan juni 2001370 inlägg
#1

Jag håller på att göra ett program som startar quake 3 och ansluter till en server men jag har fastnat när jag ska läsa in servrarna ifrån en textfil.
Jag använder följande kod för att läsa filen och lägga in det i min listbox:

ifstream fin;
fin.open("server.cfg");
if (fin.is_open())
{
while (fin.get(ch))
SendDlgItemMessage(hwnd, IDC_SERVER, LB_ADDSTRING, 0, (LPARAM)ch);
}
fin.close();

men när jag gör så så får jag följande felmeddelanden:

C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(34) : error C2360: 
initialization of 'fin' is skipped by 'case' label
        C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(25) :
 see declaration of 'fin'
C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(37) : error C2360: 
initialization of 'fin' is skipped by 'case' label
        C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(25) :
 see declaration of 'fin'
C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(39) : error C2360: 
initialization of 'fin' is skipped by 'case' label
        C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(25) :
 see declaration of 'fin'
C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(47) : error C2360: 
initialization of 'fin' is skipped by 'case' label
        C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(25) :
 see declaration of 'fin'
C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(71) : error C2360:
 initialization of 'fin' is skipped by 'case' label
        C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(25) :
 see declaration of 'fin'
C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(74) : error C2361: 
initialization of 'fin' is skipped by 'default' label
        C:\Documents and Settings\johan\Mina dokument\programmering\projekt\q3 launcher\main.cpp(25) :
 see declaration of 'fin'
Error executing cl.exe.

någon som vet hur jag ska göra ?
Jag är rätt så ny på filhantering så jag tror att detta skulle vara ett projekt att lära sig på.

Edit:
Glömde min andra fråga:
Hur gör jag för att starta ett annat program?

Alpha IIMedlem sedan maj 20002 993 inlägg
#2

Så här brukar jag läsa filer:


FILE * pFile = NULL;

pFile = fopen("fil.txt", "rb");

if(pFile == NULL)
  // Kunde inte öppnas

char str[255];
fread(str, sizeof(char) * 255, pFile);

if (ferror( pFile ))
// Fel i läsningen av filen

fclose(pFile);

Nu var ju det där mest för läsning av binära filer. Har för mig att det ska finnas en funktion som heter fget() också som läser rader.

puhbjörnMedlem sedan juni 2001370 inlägg
#3

Ok, får väl testa det. Fast jag är ju hos min kompis com lånat min c++ bok nu så jag får väl ta och läsa igen den också.

Marcus EMedlem sedan maj 20021 466 inlägg
#4

Har du över huvud taget läst felmeddelandet? :)
"initialization of 'fin' is skipped by 'case' label"

Det antyder att det har något med switch/case att göra. Prova att lägga koden i ett eget block {}.

puhbjörnMedlem sedan juni 2001370 inlägg
#5

Ja, jag har läst felmeddelandet men förståd inte så mcyket, men jag ska testa det du sa.

PeWMedlem sedan juni 200010 432 inlägg
#6

För det mesta lämnar kompilatorer tips om vad som är fel. Hittar man inte felet ändå är debuggern ens bästa vän :)

puhbjörnMedlem sedan juni 2001370 inlägg
#7

Har tyvärr aldrig använt degubern särskilt mycket, har svårt att förstå mig på allting som visas. :(

ChainsawMedlem sedan sep. 20001 124 inlägg
#8

Pröva att sätta "ifstream fin;" före switch-satsen. Fast jag tycker att varningen/felet låter misstänkt likt en kompilatorbugg. Vilken kompilator, och vilka felrättningar har du installerat?

PeWMedlem sedan juni 200010 432 inlägg
#9

Har tyvärr aldrig använt degubern särskilt mycket, har svårt att förstå mig på allting som visas.

Nej jag säger inte att det är enkelt, men ett tips är att åtminstone försöka sätta sig in i vad som sker och varför det sker. Då blir debuggern din bästa vän :)

puhbjörnMedlem sedan juni 2001370 inlägg
#10

Visual c++ 6.0 använder jag, felrättningar vet jag inte vad det är riktigt, skulle du kunna förklara mer. Det börjar i alla fall fungera lite nu, i alla fall så länge filen är tom om den inte är det så får jag ett minnesfel!

felet:
instruktionen på "0x77d38c2c" referade till "0x00000073".
The memory could not be read

PeWMedlem sedan juni 200010 432 inlägg
#11

Ser ut som att du petar i minne som du inte ska peta i, men att felet ligger i hur funktioner ska användas inte i hur du själv pekar i minnet. Vid avlusning av minnesfel är debuggern verkligen ens bästa vän då den steg för steg avslöjar vad varje processorinstruktion gör, men i ditt fall är kanske koden såpass liten att man ändå kan klura ut vad som går snett. Du skriver att om filen är tom fungerar det... kan det tyda på att det du läst in och vill skicka vidare inte är det du tror det är? Om filen är tom körs ju inte whileloopen... ;)

puhbjörnMedlem sedan juni 2001370 inlägg
#12

PeW skrev:

Har tyvärr aldrig använt degubern särskilt mycket, har svårt att förstå mig på allting som visas.

Nej jag säger inte att det är enkelt, men ett tips är att åtminstone försöka sätta sig in i vad som sker och varför det sker. Då blir debuggern din bästa vän :)

Jag följde ditt råd pew och satte ut lite breakpoints och fick ett nytt meddelandet. Och allting i fin assembler(?).

Bifogar en bild också.

bild

Edit: ser precis nu att min c++ bok ligger precis ijämte mig, får nog ta och öppna den.

Edit 2: Nu vet jag på vilken rad felet är, men jag vet inte hur jag ska lösa det.

ifstream fin("server.cfg");
char ch;
while (fin.get(ch))
SendDlgItemMessage(hwnd, IDC_SERVER, LB_ADDSTRING, 0, (LPARAM)ch);(felet är här)
fin.close();
PeWMedlem sedan juni 200010 432 inlägg
#13

Jag följde ditt råd pew och satte ut lite breakpoints och fick ett nytt meddelandet. Och allting i fin assembler(?).

Bifogar en bild också.

bild

Edit: ser precis nu att min c++ bok ligger precis ijämte mig, får nog ta och öppna den.

Jo, det är i x86 assembler. Men bara att titta på ett stycke leder sällan någon vart då det är ett antal rader... ;) Som sagt så tror jag att felet är att du läser in ett tecken, men av funktionen du anropar tolkar det tecknets värde (ascii för 73?) som en minnesadress och då blir det knas. Inte säker på detta, men om det är så, blir det naturligtvis en krasch.

Lite god litteratur är aldrig fel :)

puhbjörnMedlem sedan juni 2001370 inlägg
#14

Hur gör jag att för att läsa in varje rad istället ?
Knaske har nogåt med det att göra men jag är inte säker.
För om jag tar bort

SendDlgItemMessage(hwnd, IDC_SERVER, LB_ADDSTRING, 0, (LPARAM)ch);(felet är här)

så funkar ju det, är det någon som vet om det finns ngot annat sätt att lägga till nya rader i en listbox?

Marcus EMedlem sedan maj 20021 466 inlägg
#15

Chainsaw skrev:

Pröva att sätta "ifstream fin;" före switch-satsen.

Ja, det är också en lösning. Antingen kan man deklarera variabeln utanför switch-satsen eller innanför om man lägger den innanför ett klammerblock {}.

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)