Hei,
Minulla on tiedosto, jossa on jokaisella rivillä 5 sanaa, tyyliin:
jaska jokunen tietotia1 00100 hki
aku ankka ankkalinnantie1 313 ankkalinna
Onko keinoa, jolla voisin viitata esim. toisen rivin sanaan 2 ja 3, eli tulostaisin nuo ohjelmassani tiedoston sisältä?
Rivin sanoihin viittaaminen
9
769
Vastaukset
- TRRY
Avaa tiedosto (fopen), ja lue rivit fscanf("%s %s %s %s %s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka).
- mutta...
Eipä tuo toiminutkaan... :/
ongelma lienee se, että mulla on noi tiedot CSV -tiedostossa ja eihän siinä olekaan nuo tiedot erikseen kun notepadilla tarkastelee (eikä excelillä), vaan tiedot on eritetty puolipisteellä....
Oisko vinkkejä miten saan parsittua puolipisteillä erotetut tiedot tiedostosta esimerkillisellä tavalla? - hemmoit
mutta... kirjoitti:
Eipä tuo toiminutkaan... :/
ongelma lienee se, että mulla on noi tiedot CSV -tiedostossa ja eihän siinä olekaan nuo tiedot erikseen kun notepadilla tarkastelee (eikä excelillä), vaan tiedot on eritetty puolipisteellä....
Oisko vinkkejä miten saan parsittua puolipisteillä erotetut tiedot tiedostosta esimerkillisellä tavalla?fscanf("%s;%s;%s;%s;%s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka).
toinen tapa tässä
http://www.cppreference.com/stdstring/strtok.html - aloittaja....
hemmoit kirjoitti:
fscanf("%s;%s;%s;%s;%s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka).
toinen tapa tässä
http://www.cppreference.com/stdstring/strtok.htmlOlen nyt yrittänyt seuraavasti lukea ensimmäisen tiedostossa olevan rivin:
#include
#include
#include
#include
#include
using namespace std;
int main()
{
char enimi, snimi, katu, pnro, ptpaikka = 0;
FILE *tiedosto;
tiedosto = fopen("nimitiedot.csv", "r");
if(fscanf(tiedosto, "%s;%s;%s;%s;%s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka) == 5)
{
fclose(tiedosto);
return EXIT_SUCCESS;
}
}
Osaisko joku hjelpata, mikä tuossa mättää? :/ - TRRY
aloittaja.... kirjoitti:
Olen nyt yrittänyt seuraavasti lukea ensimmäisen tiedostossa olevan rivin:
#include
#include
#include
#include
#include
using namespace std;
int main()
{
char enimi, snimi, katu, pnro, ptpaikka = 0;
FILE *tiedosto;
tiedosto = fopen("nimitiedot.csv", "r");
if(fscanf(tiedosto, "%s;%s;%s;%s;%s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka) == 5)
{
fclose(tiedosto);
return EXIT_SUCCESS;
}
}
Osaisko joku hjelpata, mikä tuossa mättää? :/Koodissasi on tällä hetkellä pielessä pari asiaa. Ensinnäkin, koska tämä oli "C-ohjelmointi"-palsta, etkä tarkentanut ohjelmointikieltä, sait apua C-kielellä. Nykyisen koodisi alkuloitsut ovat kuitenkin C :aa. Jos haluat C-kielisen ratkaisun, heitä roskiin kaikki nykyiset #include-rivit ja niitä seuraava using-rivi. Tehtävään riittää stdio-kirjasto, eli kirjoita alkuun vain #include .
Toinen ongelma on muistinvaraus. enimi-muuttujaan ja muihin vastaaviin muuttujiin mahtuu tietoa yhden merkin (char) verran. Kun annat fscanf:lle parametrin "&enimi", annat sille muistiosoitteen tuohon yhden merkin mittaiseen muistipaikkaan. Siihen fscanf:n pitäisi kirjoittaa jäsentämänsä merkkijono. Mikään ei-tyhjä merkkijono ei kuitenkaan mahdu siihen, koska jokainen C-merkkijono päättyy erityiseen lopetusmerkkiin, joka tietenkin tarvitsee yhden merkin muistia.
Varaa siis merkkijonoille enemmän muistia. Jos kaikki sanat ovat esimerkiksi alle 30 merkin mittaisia, määrittele muuttujat
char enimi[30], snimi[30], katu[30], ...;
ja voit vielä varmuuden vuoksi määritellä fscanf:ssä
fscanf(tiedosto, ")s;)s;)s;)s;)s\n", ...)
jolloin fscanf ei yritä vahingossakaan kirjoittaa mihinkään muuttujista niin montaa merkkiä, ettei se mahtuisi varattuun muistiin.
Ja jos sinun ei ole pakko tehdä hommaa C:llä, olisit jo jäsentänyt merkkijonot kaksirivisellä Python-ohjelmalla:
for rivi in file("nimitiedot.csv"): print "etunimi:", rivi.split(";")[0] - aloittaja...
TRRY kirjoitti:
Koodissasi on tällä hetkellä pielessä pari asiaa. Ensinnäkin, koska tämä oli "C-ohjelmointi"-palsta, etkä tarkentanut ohjelmointikieltä, sait apua C-kielellä. Nykyisen koodisi alkuloitsut ovat kuitenkin C :aa. Jos haluat C-kielisen ratkaisun, heitä roskiin kaikki nykyiset #include-rivit ja niitä seuraava using-rivi. Tehtävään riittää stdio-kirjasto, eli kirjoita alkuun vain #include .
Toinen ongelma on muistinvaraus. enimi-muuttujaan ja muihin vastaaviin muuttujiin mahtuu tietoa yhden merkin (char) verran. Kun annat fscanf:lle parametrin "&enimi", annat sille muistiosoitteen tuohon yhden merkin mittaiseen muistipaikkaan. Siihen fscanf:n pitäisi kirjoittaa jäsentämänsä merkkijono. Mikään ei-tyhjä merkkijono ei kuitenkaan mahdu siihen, koska jokainen C-merkkijono päättyy erityiseen lopetusmerkkiin, joka tietenkin tarvitsee yhden merkin muistia.
Varaa siis merkkijonoille enemmän muistia. Jos kaikki sanat ovat esimerkiksi alle 30 merkin mittaisia, määrittele muuttujat
char enimi[30], snimi[30], katu[30], ...;
ja voit vielä varmuuden vuoksi määritellä fscanf:ssä
fscanf(tiedosto, ")s;)s;)s;)s;)s\n", ...)
jolloin fscanf ei yritä vahingossakaan kirjoittaa mihinkään muuttujista niin montaa merkkiä, ettei se mahtuisi varattuun muistiin.
Ja jos sinun ei ole pakko tehdä hommaa C:llä, olisit jo jäsentänyt merkkijonot kaksirivisellä Python-ohjelmalla:
for rivi in file("nimitiedot.csv"): print "etunimi:", rivi.split(";")[0]Kiitos edellisestä.
Tosiaan C :lla olisi tarkoitus tätä vääntää...
En haluaisi Pythonia tähän sekottaa, vaan ihan pelkällä c :lla...
Nyt olen päässyt tällaiseen vaiheeseen, lienen oikeilla jäljillä mutta nyt on taas nuo puolipisteillä erotettavat tiedot ongelmana...
#include
#include
#include
#include
#include
using namespace std;
int main()
{
char enimi[40], snimi[40], katu[40], pnro[40], ptpaikka[40];
string rivi;
ifstream tiedosto("nimitiedot.csv");
// avataan tiedosto lukemista varten
tiedosto.open("nimitiedot.csv", ios_base::in);
// luetaan puolipisteillä erotetut tiedot tiedostosta muuttujiin
while( tiedosto )
{
/* tähän yritin jo kaikenlaista mutta erroria vaan pukkaa tai
sitten ei tulostu mitään */
}
// suljetaan lopuksi tiedosto
tiedosto.close();
return EXIT_SUCCESS;
} - TRRY
aloittaja... kirjoitti:
Kiitos edellisestä.
Tosiaan C :lla olisi tarkoitus tätä vääntää...
En haluaisi Pythonia tähän sekottaa, vaan ihan pelkällä c :lla...
Nyt olen päässyt tällaiseen vaiheeseen, lienen oikeilla jäljillä mutta nyt on taas nuo puolipisteillä erotettavat tiedot ongelmana...
#include
#include
#include
#include
#include
using namespace std;
int main()
{
char enimi[40], snimi[40], katu[40], pnro[40], ptpaikka[40];
string rivi;
ifstream tiedosto("nimitiedot.csv");
// avataan tiedosto lukemista varten
tiedosto.open("nimitiedot.csv", ios_base::in);
// luetaan puolipisteillä erotetut tiedot tiedostosta muuttujiin
while( tiedosto )
{
/* tähän yritin jo kaikenlaista mutta erroria vaan pukkaa tai
sitten ei tulostu mitään */
}
// suljetaan lopuksi tiedosto
tiedosto.close();
return EXIT_SUCCESS;
}#include
#include
using namespace std;
int main() {
ifstream f("nimitiedot.csv");
char enimi[40]; // ja muut...
while (! f.eof()) {
f.getline(enimi, 40, ';');
// lue tässä loputkin samaan tapaan, paitsi viimeinen kenttä
// seuraavasti, koska se ei lopu puolipisteeseen:
f.getline(ptpaikka, 40);
}
f.close();
} - ei toimi :/
TRRY kirjoitti:
#include
#include
using namespace std;
int main() {
ifstream f("nimitiedot.csv");
char enimi[40]; // ja muut...
while (! f.eof()) {
f.getline(enimi, 40, ';');
// lue tässä loputkin samaan tapaan, paitsi viimeinen kenttä
// seuraavasti, koska se ei lopu puolipisteeseen:
f.getline(ptpaikka, 40);
}
f.close();
}Tuota esimerkkisi silmukkaa en saanut toimimaan, mutta heitin siihen tällaisen silmukan:
while(getline(tiedosto, rivi))
{
tiedosto.getline(enimi, 40, ';');
tiedosto.getline(snimi, 40, ';');
tiedosto.getline(katu, 40, ';');
tiedosto.getline(pnro, 40, ';');
tiedosto.getline(ptpaikka, 40, ';');
cout - Aloittaja...
TRRY kirjoitti:
#include
#include
using namespace std;
int main() {
ifstream f("nimitiedot.csv");
char enimi[40]; // ja muut...
while (! f.eof()) {
f.getline(enimi, 40, ';');
// lue tässä loputkin samaan tapaan, paitsi viimeinen kenttä
// seuraavasti, koska se ei lopu puolipisteeseen:
f.getline(ptpaikka, 40);
}
f.close();
}Itse olinkin mokannut tuon viimeisen sarakkeen...
Nyt näyttäs pelittävän,
suuret kiitokset!!!
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
SDP on vastuunkantaja, ja siksi suosituin kansan keskuudessa
Kiusaamiseenkin SDP puuttuu heti sellaisen tultua ilmi. Esimerkiksi persut lakaisevat nämä maton alle ja pahentavat site1926576Punavihreät puolueet haluavat Suomeen satoja tuhansia kehitysmaalaisia
SDP, vihreät ja vassarit haluavat nostaa esim. pakolaiskiintiötä todella paljon. Orpon hallituksen aikana maahanmuutto1065483Häirintäkohun keskellä olevalta kansanedustajalta Jani Kokolta (sd) rajua tekstiä somessa.
https://www.is.fi/politiikka/art-2000011772322.html Ajaakohan tämä SDP:n kansanedustaja Jani Kokko oikein täysillä valoi1253448Nyt tuli Suomen somaleista todella ikävää faktaa
sillä osa somalivanhemmista lähettää lapsiaan kotimaahansa kurinpitolaitoksiin, joissa heitä pahoinpidellään. Illan MOT2653405Kähmijä puolueen kannatus romahtamassa
Erityisesti naiset ovat suuttuneet SDP:lle kertoo asiantuntijat872425Kommentti: oikeuslaitos korvattava SDP:n johdolla
Näkisin että Suomessa tuomiovalta pitäisi olla demareiden johtoportaalla. Koska porvarimedia säestettynä persujen kirku32135Sinä et halunnut sitoutua
Samalla tavalla kyin minä ja koen vihdoinkin että se on ihan ok. Sitoutuminen merkitsi meille erilaisia asioita, eikä ne191836Läppärit kahviloissa
Aika omituista nykyään, että mennään ”trendikkäästi” tekemään lämppärillä töitä kahviloihin ja viedään moneksi tunniksi521802Persut pettävät ja valehtelevat aina
Petoksistahan jää kiinni kuten olemme persujen kannatusromahduksesta nähneet, mutta siitä huolimatta persut jatkavat val521751- 981386