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
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.
Olisiko kyseisestä saada ihan ohjelmallista esimerkkiä?
nimim. puupää
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"; }
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++; }
Juu.. eipä tullut keksittyä tuota... no on jäänyt toi tapa PHP:llä ohjelmoinnista.
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ö?
Aihe on jo aika vanha, joten et voi enää vastata siihen.