mikä tässä mättää ?

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 ?
5684
Äänestä

Muut lukivat myös

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;
}

Äänestä
  • 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.

    Äänestä

  • tyhmäääää kirjoitti:

    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);

    Äänestä

  • Builder kirjoitti:

    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...

    Äänestä

  • ÖLLÖ kirjoitti:

    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);
    // }

    Äänestä

Kommentoi aloitusta


tyhmäääää kirjoitti:

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 ?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu