Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tiedostonkäsittely ongelmia

WKoA [30.10.2005 14:19:53]

#

Olen tekemässä lintupäiväkirjaa C++:lla, mutta nyt meni sormi kyynärpäätä myöten suuhun...

Eli ongelmani on etten saa tiedostosta muokattua riviä X uuteen kuosiin, eli toisin sanoen en vain osaa... Osaisiko joku auttaa?

Alla on tämänhetkinen koodi. Muokkaus ominausuus tulisi kohtaan "case 3".

#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <stdio.h>
#include <string.h>

using namespace std;

int main(int argc, char *argv[])
{

  /*
  Koodi on köyhää, siinä on runsaasti turhia
  muuttujia ja muuta turhaa, eikä sitä ole
  kommentoitu. Koodia ei suositella
  selattavaksi eikä kopioitavaksi, koska
  koodaustapa ja tekniikka on karseaa.
  Koodin kirjoittaja ei vastaa
  mahdollisista laitteisto-, tai fyysisistä
  vammoista joka seuraa koodin ulkoasun
  näkemisestä.
  */

  cout << "Lintupäiväkirja" << endl << endl;

  int muuttuja;
  int valinta = -999;
  string s;
  string rivi;
  string lintu, paikka, pvm, klo;

  do {

      cout << "Mitä tehdään?" << endl;
      cout << "1) Luetaan taulukko" << endl;
      cout << "2) Lisätään havainto" << endl;
      cout << "3) Muokataan havaintoa" << endl;
      cout << "0) Poistutaan ohjelmasta" << endl;
      cin >> valinta;
      cout << endl;

  switch(valinta){

  case 1: {
        ifstream fi("C:\\lintu.txt");
                if ( !fi ) {
                cout << "Tiedosto ei aukea!" << endl;
                return 1;
                }
        while ( getline(fi,s) ) {
            cout << s << "\n";  }
        break;
        }

  case 2: {
        cout << "Mikä lintu?: ";
        cin >> lintu;
        cout << endl;

        cout << "Anna havaintopaikka?: ";
        cin >> paikka;
        cout << endl;

        cout << "Anna havoinnon päivämäärä?: ";
        cin >> pvm;
        cout << endl;

        cout << "Anna havainto aika?: ";
        cin >> klo;
        ofstream levylle("C:\\lintu.txt", ios::app);
        levylle << lintu <<" "<< paikka <<" "<< pvm <<" "<< klo << endl;
        levylle.close();
        break;
        cout << endl;
        }

  case 3: {
          }

  case 4: {
          }

  }
}  while(valinta);

  system("PAUSE");
  return 0;

  /*
  Mutta kaikesta huolimatta se
  todella toimii luotettavasti!
  */

}   // main

Mazuli [30.10.2005 14:46:54]

#

Luet ensin tiedoston rivit vaikka vektoriin. Sitten poistat
haluamasin kohdan erase metodilla (http://www.cppreference.com/cppvector/erase.html). Tämän jälkeen kirjoitat vektorin jokaisen rivit takaisin tyhjään tiedostoon.

WKoA [30.10.2005 17:44:00]

#

Olisiko kyseisestä saada ihan ohjelmallista esimerkkiä?

nimim. puupää

Mazuli [30.10.2005 17:56:05]

#

no

string temp;
vector<string> rivit;

//luetaan rivit

while(!tiedosto.eof())
{
  getline(tiedosto, temp);
  rivit.push_back(temp);
}

//poistetaan haluttu rivi

rivit.erase( rivit.begin() + rivinumero );

//tallennetaan takaisin tiedostoo

for(int i = 0; i < rivit.size(); i++)
{
   tiedosto << rivi << "\n";
}

Metabolix [30.10.2005 18:50:11]

#

Tai sitten ilman moista muistintuhlausta. Nimetään siis ensin alkuperäinen tiedosto uudestaan, ja sitten:

string temp;
int rivi;
int poistettava;

// luetaan rivejä ja jätetään poistettava tallentamatta.
while (!vanha_tiedosto.eof())
{
  getline(vanha_tiedosto, temp);
  if (rivi != poistettava)
    uusi_tiedosto << temp << "\n";
  rivi++;
}

Mazuli [30.10.2005 19:07:04]

#

Juu.. eipä tullut keksittyä tuota... no on jäänyt toi tapa PHP:llä ohjelmoinnista.

Jyri [30.10.2005 19:34:37]

#

WKoA kirjoitti:

        ofstream levylle("C:\\lintu.txt", ios::app);
        levylle << lintu <<" "<< paikka <<" "<< pvm <<" "<< klo << endl;
        levylle.close();
        break;
        cout << endl;
        }

}   // main

Tuohon koodiisi puuttuisin sen verran, että eikö tuo "ios::app" pitäisi olla muodossa "ios_base::app"? Ainakin itse opin sen joskus noin. Vai meinaako ne samaa? Ja jos tuo cout << endl; on break; lauseen jälkeen niin eihän sillä ole mitään virkaa. Eikö?

Vastaus

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

Tietoa sivustosta