Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Pieni tulostusongelma

Sivun loppuun

Maajo [04.01.2005 12:03:34]

#

#include<stdio.h>

int main()
{
    int a[10][10];
    int b[10][10];
    int i,j;

    FILE *mata,*matb,*summa ;

    if( (mata = fopen("mata.txt", "r"))==NULL)
    {
        printf("\nerror opening the file mata");
        exit(1);
    }
    if( (matb = fopen("matb.txt", "r"))==NULL)
    {
        printf("\nerror opening the file matb");
        exit(1);
    }
    if( (summa = fopen("summa.usr", "w"))==NULL)
    {
        printf("\nerror opening the file summa");
        exit(1);
    }
    for ( i=0;i<10;i++)
        for( j=0;j<10;j++)
            fscanf(mata,"%d",&a[i][j]);
    for ( i=0;i<10;i++)
    {
        for( j=0;j<10;j++)
            fscanf(matb,"%d",&b[i][j]);
    }
    for ( i=0;i<10;i++)
    {
        for( j=0;j<10;j++)
            fprintf(summa,"%d",a[i][j]+b[i][j]);
        printf("Matriisien summa on laskettu tiedostoon summa.usr.\n");
    }

    return 0;
}

Ohjelma tulostaa tuolla koodilla "Matriisien summa on laskettu tiedostoon summa.usr."-lauseen kymmenen kertaa. Missä on vika?

Olen kokeillut sulkujen muuttamista ja lukujen muuttamista, mutta ne ovat vieneet joko täysin väärään suuntaan tai sitten ne eivät ole vaikuttaneet mitenkään... Osaatteko neuvoa, mitä mun pitäis nyt tehä?

remontti-reiska [04.01.2005 12:08:55]

#

Kannattaa ottaa se printf -funktio vekka siitä viimeisestä for -silmukasta, niin ei tulosta kymmentä kertaa.

Antti Laaksonen [04.01.2005 12:09:15]

#

No sehän johtuu siitä, että tekstin tulostava rivi on for-silmukan sisällä. Kun lopetat for-silmukan yhden rivin aikaisemmin, niin tekstikin tulee näkyviin vain kerran.

Maajo [04.01.2005 12:12:28]

#

Tarkoitatteko, että siirtämällä }-merkin ennen printf:ää, pitäisi sen tulostaa vain kerran tuo lause?

        for( j=0;j<10;j++)
            fprintf(summa,"%d",a[i][j]+b[i][j]);
    }
        printf("Matriisien summa on laskettu tiedostoon summa.usr.\n");

    return 0;
}

Ei toimi. Se heittää sitten sen summa tiedoston aivan vääränlaiseksi (pitäisi tulostaa riveinä, mutta tulostaakin sitten kaiken putkeen).

Antti Laaksonen [04.01.2005 12:19:13]

#

Ei printf-rivillä ole ainakaan mitään tekemistä sen kanssa, mitä tiedostoon tulee. Jos haluat kirjoittaa tiedot riveittäin, kirjoita tiedostoon rivinvaihto (\n) uloimman for-silmukan päätteeksi. Pane myös %d:n perään yksi välilyönti, jotta lukujen väliin jää tilaa.

Maajo [04.01.2005 12:23:57]

#

Antti Laaksonen kirjoitti:

Ei printf-rivillä ole ainakaan mitään tekemistä sen kanssa, mitä tiedostoon tulee. Jos haluat kirjoittaa tiedot riveittäin, kirjoita tiedostoon rivinvaihto (\n) uloimman for-silmukan päätteeksi. Pane myös %d:n perään yksi välilyönti, jotta lukujen väliin jää tilaa.

Häh? Nyt meni jo vähän yli hilseen... :(

Kummasti kyllä se tulostaa summa tiedoston oikeanlaiseksi, kun siellä välissä ei ole niitä sulkeita... Miksi ne sitten vaikuttavat siten sisältöön, jos printf:llä ei ole vaikutusta?

remontti-reiska [04.01.2005 12:34:11]

#

Eli etkö ymmärtänyt herra Laaksosen antamaa selostusta? No näin se kirjoitus kuitenkin menee.

fprintf(summa,"%d ",a[i][j]+b[i][j]\n);

Mutta, eikös tiedostoon pitäisi kirjoittaa "a" eikä "w" parametrillä?

Maajo [04.01.2005 12:44:25]

#

remontti-reiska kirjoitti:

Eli etkö ymmärtänyt herra Laaksosen antamaa selostusta? No näin se kirjoitus kuitenkin menee.

fprintf(summa,"%d ",a[i][j]+b[i][j]\n);

Mutta, eikös tiedostoon pitäisi kirjoittaa "a" eikä "w" parametrillä?

Ohjelma herjaa tuosta kirjoitustyylistä... "Ei-sallittuja merkkejä lähdekoodissa. (erikoismerkkejä (esim. \t, \n, jne.) lainausmerkkien ulkopuolelle)". Jos sen siihen laittaa, niin tuleeko siihen sitten ,"\n" ?

Jos sen (,"\n") niin laittaa, niin käy näin: "Virhe muotoilumerkkijonon käyttämisessä."

Miksi "a", miksi ei "w"?

remontti-reiska [04.01.2005 12:57:41]

#

Kannattaa tulostaa se /n sinne erillisellä fprintf-funktiolla.

Maajo [04.01.2005 13:07:14]

#

Siis näinkö?

        for( j=0;j<10;j++)
            fprintf(summa,"%d ",a[i][j]+b[i][j]);
            fprintf("\n");
    }
    }
        printf("Matriisien summa on laskettu tiedostoon summa.usr.\n");

    return 0;
}

Tuo saa ohjelman ilmoittamaan virhettä funktion fprintf käytössä.

Gaxx [04.01.2005 13:27:10]

#

Laita \n noiden heittomerkkien sisään.

fprintf(summa,"%d\n",a[i][j]+b[i][j]);

Miksi et muuten käytä %d:n sijasta %i:tä?

fprintf("\n");

Ongelmana on se, ettet kerro funktiolle mihin tiedostoon haluat kirjoittaa. Näin se olisi oikein:

fprintf(summa, "\n");

Maajo [04.01.2005 13:34:51]

#

Ei tuota saa muuten muutettua? Kun tuossa päädytään takaisin ongelmaan, joka mulla oli aiemmin. Eli se tulostaa summa-tiedoston luvut joko putkeen (ei väliä %d perässä) tai sitten väli joka luvun perään eli myös rivin viimeisen perään. Rivin lopussa ei tule olla tuota väliä vaan rivinvaihto.

Koodi toimii (summa-tiedosto tulee oikein) keskustelun 1.viestissä olevan koodin mukaan, mutta tulostaa lauseen kymmenen kertaa (muuttamalla esim. sulkeiden sijaintia, lause saattaa tulla jopa satoja kertoja eli mm. sulkeet vaikuttavat lopputulokseen).

Gaxx [04.01.2005 15:01:13]

#

Ehkä et ole vielä päässyt jyvälle ohjelmoinnin ihmeellisestä maailmasta. Ongelmaasi on mielestäni hyvin hankala lähteä selostamaan ilman koodia. pistän nyt valmiin koodin, mutta toivon sinun edes yrittävän ymmärtää se.

fprintf(summa, "%d", a[0][0] + b[0][0]); // tulostetaan "pötkän ensimmäinen luku"
for ( i=0;i<10;i++) {
    for( j=0;j<10;j++) {
        if(!(i == 0 && j == 0)) {        // ettei tulosteta "pötkön ensimmäistä lukua" uudelleen
            fprintf(summa," %d",a[i][j]+b[i][j]);
        }
    }
}
fprintf(summa, "\n");                    // pötkön perään rivin vaihto
printf("Matriisien summa on laskettu tiedostoon summa.usr.\n");

Tuo siis pitäisi tulostaa tulokset peräkanaan välilyönnillä erotettuina ja lopussa ei ole välilyöntiä vaan rivinvaihto.

Tarkista, meneekö se nyt oikein(en ole varma ymmärsinkö mitä haluat tehdä, mutta uskon kyllä). En testannut koodin toimivuutta muuten kuin, että se menee kääntäjästä läpi.

Maajo [04.01.2005 15:40:09]

#

Joo, kiitokset avunannoista. :) Sain jo asian ratkaistuksi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta