Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Tietojen lisäys tiedostoon (C)

Plasmidi [07.10.2007 12:39:43]

#

#include <stdio.h>

struct henkilo{
 char etunimi[20+1];
 char sukunimi[20+1];
 char puhelinnumero[20+1];
};

int main(void)
{
 struct henkilo hloTaulukko[50];
 const char *tiedNimi = "luettelo.txt";
 FILE *fp;
 int i;

 printf("Anna etunimi:");
 scanf("%s", hloTaulukko[i].etunimi);

 printf("Anna sukunimi:");
 scanf("%s", hloTaulukko[i].sukunimi);

 printf("Anna puhelinnumero:");
 scanf("%s", hloTaulukko[i].puhelinnumero);

 printf("Tietojen tallennus onnistui.\n");

 fp = fopen(tiedNimi, "a");

 fprintf(fp,"%s %s %s",
      hloTaulukko[i].etunimi, hloTaulukko[i].sukunimi, hloTaulukko[i].puhelinnumero);

 fclose(fp);

 return 0;
}

Olen tehnyt tuommoisen koodipätkän ja ohjelmani tulostaa näin:

Tiedoston luettelo.txt sisältö:

1
Kalle Kaveri 05-118

Esko Esimerkki 123-4567890

Ongelmana on se, että tuon numero ykkösen paikalle pitäisi tulla numero kaksi sen mukaan, kuinka monen henkilön tiedot puhelinluettelossa on. Ohjeissa sanotaan näin: Tallennettaessa tietoja, tiedoston ensimmäisen rivin arvon on kasvettava yhdellä. Miten tuon saisi tehtyä? Miten saisin myös tuon ylimääräisen rivinvaihdon pois tuosta nimien välistä?

Ohjelman pitäisi tulostaa näin:

2
Kalle Kaveri 05-118
Esko Esimerkki 123-4567890

Metabolix [07.10.2007 15:38:40]

#

Sinun täytyy lukea ensimmäinen rivi lukumuuttujaan, korottaa sitä yhdellä ja tallentaa uudestaan. Ongelmana on vain se, että tiedostoon ei voi tallentaa vain yhtä riviä minne sattuu, koska tieto on yhtenä jonona eikä riveittäin.

Olkoon tiedosto vaikkapa tällainen:

Matti
Pekka
Maija

Levyllä se näyttää tältä (nyt / tarkoittaa rivinvaihtoa):
Matti/Pekka/Maija
Jos ensimmäiselle riville (Matti) kirjoitetaankin jokin muu nimi, vaikkapa Pellervo, käy näin:
Pellervokka/Maija
Eli tekstitiedostona:
Pellervokka
Maija

Joudut siis lukemaan kaikki tiedot taulukkoon ja kirjoittamaan koko tiedoston uudestaan, jotta saat numeron vaihdettua (mikäli tapahtuu kymmenylitys; muutenhan ongelmaa ei synny, kun uusi tieto on saman kokoinen).

// Lue tiedostosta määrä
for (i = 0; i < maara; ++i) {
    // Lue tiedostosta tiedot taulukkoon (rivi[i].etunimi, ...)
}
// Tallenna tiedostoon määrä + 1
// Tallenna taulukosta tiedot (ks. yllä)
// Tallenna uusi tieto

Et muuten ole koodissasi alustanut i-muuttujaa lainkaan. Mitä edes yrität tehdä sillä?

Plasmidi [07.10.2007 17:07:46]

#

Koodi on nyt tämmönen:

#include <stdio.h>

struct henkilo{
 char etunimi[20+1];
 char sukunimi[20+1];
 char puhelinnumero[20+1];
};

int main(void)
{
 struct henkilo hloTaulukko[50];
 const char *tiedNimi = "luettelo.txt";
 FILE *fp;
 int i, maara;

 printf("Anna etunimi:");
 scanf("%s", hloTaulukko[i].etunimi);

 printf("Anna sukunimi:");
 scanf("%s", hloTaulukko[i].sukunimi);

 printf("Anna puhelinnumero:");
 scanf("%s", hloTaulukko[i].puhelinnumero);

 printf("Tietojen tallennus onnistui.\n");

 fp = fopen(tiedNimi, "a");

 for (i = 0; i < maara; ++i) {
 fscanf(fp,"%s %s %s", hloTaulukko[i].etunimi, hloTaulukko[i].sukunimi, hloTaulukko[i].puhelinnumero);
 }

 maara = maara + 1;

 fprintf(fp,"%d", maara);

 fprintf(fp,"%s %s %s",
      hloTaulukko[i].etunimi, hloTaulukko[i].sukunimi, hloTaulukko[i].puhelinnumero);

 fclose(fp);

 return 0;
}

Mitä vikoja tossa on?

hunajavohveli [07.10.2007 17:16:10]

#

Muuttujaa maara ei ole alustettu missään vaiheessa. Sinun pitää tallentaa se johonkin ja sitten hakea muuttujaan ohjelman alussa (suosittelen erillistä tiedostoa tähän).

printf("Tietojen tallennus onnistui.\n");

Tämä vähän hämää ohjelman tulkitsemista, koska tuossa vaiheessa mitään ei todellisuudessa ole vielä tallennettu.

FooBat [09.10.2007 18:12:31]

#

Alusta samalla muuttuja 'i'.

Vastaus

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

Tietoa sivustosta