Pitäisi saada luettua tiedostosta rivit ja lisättyä tulostuksessa jokaisen rivin eteen rivinumero tyyliin /* 01 */ . Miten tämä onnistuu?
Rivinumero tiedostosta luettaessa C++
Katja
14988
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 14
Vanhimmat
FILE *data;
char line[320];
int counter=0;
if((data=fopen("teksti.txt","rt"))==NULL)return;
while(feof(data)){
fgets(data,320,data);
sprintf(stdout,"/* %d04 */ %s
",counter,line);
counter++;
}
fclose(data);
adangadin koodi:
FILE *data;
char line[320];
int counter=0;
if((data=fopen("teksti.txt","rt"))==NULL)return;
while(feof(data)){
fgets(line,320,data); //
niin ei tunnut missään
Esimerkki bugaa, sillä:
-rivejä ei lueta koskaan, sillä whilen feof palauttaa nollan, kun ei olla tiedoston lopussa (testi pitää olla !feof(..))
-se ei näytä hallitsevan ylipitkiä rivejä siististi (yli 320 merkkiä)
-sprintf:n 1. argumentti on char *, ei FILE *
-format string %d04 pitäisi käsittääkseni olla %04d
-fgets:n paluuarvoa ei tarkisteta ollenkaan
#include
#include
#include
int main(int argc,char *argv[]) {
FILE *fp;
char line[100];
unsigned int lineno = 1;
if ( (fp = fopen(argv[1], "r")) == NULL ) {
printf("open error!
");
return EXIT_FAILURE;
}
while( fgets(line, sizeof(line), fp) != NULL) {
printf("/* %u */ ", lineno);
do {
printf("%s", line);
if (strchr(line, '
'))
break;
if (fgets(line, sizeof(line), fp) == NULL)
break;
} while(1);
lineno++;
}
fclose(fp);
return EXIT_SUCCESS;
}
Tämä hallitsee myös ylipitkät rivit. Luettava tekstitiedosto annetaan ohjelmalle ensimmäisenä argumenttina.
kutsuhan ohjelmaasi ilman argumenttia
if (argc == 2)
{
/***/
}
Tuttuun tyyliin jäljelle jäävien (sangen itsestäänselvien) virhetarkistusten tekeminen jätetään harjoitustehtäväksi.
Tässä foorumissakin näyttää olevan bugi, sillä ja n peräkkäin ei tulostu kuten pitää. Foorumi tekee niiden kohdalla rivinvaihdon. Antamaani esimerkkiin pitää siis laittaa korjaus riveille, missä sijaitsevat 1. printf ja strchr.
Kylläpäs bugaa oikein urakalla. Viestin esikatselussa homma toimii, mutta lopullisessa viestissä ei. Ehkä kaksi kenoa peräkkäin tekee yhden kenon ? \
Piti siis kirjoittaa, että "..sillä \ ja n.."
d
x
h
Mitähän muuta hauskaa foorumin softasta löytyykään....
:::a:::
::::::
:::c:::
:::d:::
:::e:::
:::f:::
:::g:::
:::h:::
:::i:::
:::j:::
:::k:::
:::l:::
:::m:::
:::
:::
:::o:::
:::p:::
:::q:::
::: :::
:::s:::
::: :::
:::u:::
:::v:::
:::w:::
:::x:::
:::y:::
:::z:::
Ohjelmakoodin esittämistä ajatellen surkea foorumi!
while( fgets(line, sizeof(line), fp) != NULL) {
printf("/* %u */ ", lineno);
do {
printf("%s", line);
if (strchr(line, '\n'))
break;
if (fgets(line, sizeof(line), fp) == NULL)
break;
} while(1);
lineno++;
}
while( fgets(line, sizeof(line), fp) != NULL) {
printf("/* %u */ ", lineno);
do {
printf("%s", line);
if (strchr(line, '
'))
break;
if (fgets(line, sizeof(line), fp) == NULL)
break;
} while(1);
lineno++;
}
Sisentäminen EI onnistu sarkainmerkillä (\t), mutta merkkikoodilla 255 riville saa "välilyönnin", jota järjestelmä ei siivoa pois.
...luettavan koodin liittäminen foorumin sivuille onnistuu sittenkin muutamalla pienillä korvausoperaatiolla.
Kaiken lisäksi foorumi ei näytä osaavan muuttaa oikein joitakin erikoismerkkejä. Joskus ainakin otsikoissa &-merkki jää kääntämättä html:stä, ja sen tilalla lukee & amp;..
Näköjään html suodatetaan myös, eikä tekstiä yritetä tulkita ollenkaan ns. as-is. & ja amp; kirjoitettuna peräkkäin suodatetaan, jolloin tekstin esikatselussa näkyy vain pelkkä &.