eli jostain syystä seuraava koodinpätkä jää rullaamaan ensimmäiseen lukukertaan ja tulostaa sitä..
while (!feof(tos))
{
fscanf(tos, "%[[]s", temp);
fscanf(tos, "%[^]]s", temp);
printf("%s\n", temp);
}
tiedosto mistä luetaan alkaa näin:
[Event "RUS-Cup"]
[Site "Krasnodar RUS"]
[Date "1998.??.??"]
...
miksi se tekee niin miksi miksi se niin häh ?
while (!feof(tos))
{
fscanf(tos, "%[[]s", temp);
fscanf(tos, "%[^]]s", temp);
printf("%s\n", temp);
}
tiedosto mistä luetaan alkaa näin:
[Event "RUS-Cup"]
[Site "Krasnodar RUS"]
[Date "1998.??.??"]
...
miksi se tekee niin miksi miksi se niin häh ?
Vastaukset 5
Vanhimmat
Allaoleva esimerkki nyt ainakin toimii.Kieli kaiketi C ??
Kannattaisi siirtyä suosiolla C++:aan!
-Failissa voi olla vain yksi välilyönti/rivi,kuten esimerkissäsi.
-Tässä tutkitaan ensin,montako riviä failissa on,jotta ei tulostettaisi
viimeistä riviä kahteen kertaan.En oikein keksinyt muutakaan ratkaisua
äkkipäätään.Ehkä toiset voisivat kertoa miten voisi jättää tuon ensimmäisen
while-silmukan pois????
strtok-funktiolla rivin voi pätkiä halutusta kohden vlilyönteineen.
-Katkaisukohtiin esimerkiksi hattumerkki ^.
//---------------------------------------------------------------------------
#include
#include
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
FILE *tos;
char stringi1[80];
char stringi2[80];
int n=0;
int n1;
if ((tos = fopen("stringit.txt", "r"))==NULL)
{
printf("Tiedosto ei aukea!\n");
return 1;
}
//Tutkitaan montako riviä
while ( !feof(tos) )
{
fscanf(tos, "%s", stringi1);
fscanf(tos, "%s", stringi2);
n++;
if(feof(tos)!=0)
break;
}
//Palauta tiedosto-osoitin alkuun
rewind (tos);
//Nyt voidaan tulostaa faili oikein
while ( !feof(tos) )
{
//Ei kirjoiteta viimeistä riviä kahteen kertaan
if(n1==n+1)
break;
fscanf(tos, "%s", stringi1);
printf("%s ",stringi1);
fscanf(tos, "%s", stringi2);
printf("%s\n",stringi2);
n1++;
}
fclose(tos);
printf("\nRiveja oli %d kappaletta.\n",n1-1);
getch();
return 0;
}
kiitos, mutta en kuitenkaan kesken tämän homman halua alkaa laajentamaan kielioppiani.
vaikka se noinkin toimisi niin tuo on kuitenkin turhan pitkä rakenne näin pieneen hommaan.
luultavasti minulla on jokin harha-ajatus noissa noissa []-sulkujen käytössä, mutta..emt.
Hakasulkeet noin ensi alkuun pois.Katso fscanf format specifiers.
Hakasulkeitten kera,ei tiedostosta lukeminen suju oikein.
Minulla ei jää ikuiseen luuppiin tuo sinunkaan koodisi,mutta
mitään järkevää ei synny.
Stringin määritys
char temp[80];
Kokeile allaolevaa:
fscanf(tos, "%s", temp);
printf("%s ", temp);
fscanf(tos, "%s", temp);
printf("%s\n", temp);
haka sulkeilla on erikoismerkitys se vastaa tavallaan regularexpressionia.
muistaakseni esim.
"%[^\t]s" lukee stringin joka päätyy tabulaatoriin.
char buffer[122];
fp = fopen ....
while (!feof(fp)
{
fgets(buffer, sizeof(buffer), fp); // kai se noin meni ?)
char *evt_type = strtok(buffer,"[ "); // event
char *evt_name = strtok(NULL,"\"]"); // RUS-Cup
if (evt_type != NULL && evt_name != NULL)
{
printf(evt_type);
printf(evt_name);
}
}
seuraavat oletukset tehdään lainausmerkeissä oleva teksti ei sisällä '"' tai ']' merkkejä ensimäinen sana 'Event' Type' on aina yksiosainen...
scanlisteiksi niitä kutsutaan tässä, noita hakasulkeita tai siis mitä niissä on..
JA HUOMASIN VIHDOIN MIKÄ MENI VIKAAN.
eli ensimmäisessä scanlistissa minun olisi pitänyt POISSULKEA alkava hakasulku. älyhoi..väsyneenä tajua ja muutenkaan omaa kirjoitusta osaa lukea.
tein sitten tällaisen väliaikaisen paikan:
// while (!feof(tos))
// {
// fscanf(tos, "%[^[]s", temp);
// fgetc(tos); /* luetaan pois hakasulku */
// fscanf(tos, "%[^]]s", temp);
// printf("%s\n", temp);
// }