Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: CSV tiedoston luku

Sivun loppuun

tim16 [27.04.2007 09:07:24]

#

moikka,

tarvitaan joku hyvä tapa, millä saisin luettua sd-kortilta .csv tiedoston annetteuihin muuttujiin.Esim. Ohjelmassa on muutujat TempOn,TempMin,TempMax.
SD-kortilla kirjoitettuna pilkulla erotettuna ensimmäisellä rivillä samat muutujan nimet kuin ohjelmassani ja toisella rivillä niiden arvot. esim.
1,-25,70. SD-kortin lukurutiini mulla on jo ja saan myös luettua arvot katkaistuna pilkkuun(strtok-funktio), mutta toi, miten saan sieltä TempOn muuttujan arvoksi tuon 1 jne...

SD-kortin sisältö:
TempOn,TempMin,TempMax
1,-25,70

sorsa on C:tä
saa myös laittaa postia mailiini
timo.kuisma@sci.fi

tiedoista kiitollisena
t. Timo

Metabolix [30.04.2007 00:58:34]

#

#include <stdio.h>
// ...
char teksti[] = "1,-25,70";
sscanf(teksti, "%d,%d,%d", &a, &b, &c);

tim16 [30.04.2007 09:09:39]

#

moi,

Selvennän hiukka, mitä tarkoitan.
Tuo SD-kortin sisältö ei ole vakio, muulta osin kuin nimien osalta.
Nuo arvot ovat käyttäjältä annettavissa käyttöliittymän kautta.
Siis noita arvoja ei voi suoraan kirjoittaa koodiin, vaan ne haetaan SD-kortilta ja sitten pitää verrata koodissa olevaa muuttujaa SD-kortilla olevaan muuttujaan ja ottaa sen jälkeen sen arvo koodissa olevaan muuttujaan.

t Timo

Juice [30.04.2007 09:17:38]

#

Jos luet ne arvot tuohon teksti-muuttujaan ja sitten käytät tuota sscanf-funktiota? Tuohan asettaa muuttujiin a,b ja c nuo luvut. Sovella, sovella ;)

tim16 [30.04.2007 14:27:10]

#

Moi,

Näin tein, mutta saan vaan tulokseksi pelkkää nollaa(0 0 0). Kääntäjä herjaa näin:
main.c(337): warning: #181-D: argument is incompatible with corresponding format string conversion

unsigned char buf[513];

BYTE TempOn;
int TempMax;
int TempMin;

sscanf((char*)buf, "%d,%d,%d", &TempOn, &TempMin, &TempMax);
rprintf("%d %d %d",TempOn,TempMin,TempMax);

Blaze [30.04.2007 15:14:51]

#

tim16 kirjoitti:

Kääntäjä herjaa näin:
main.c(337): warning: #181-D: argument is incompatible with corresponding format string conversion

Yrität lukea kokonaisluvun (%d) BYTE-tyyppiseen muuttujaan (TempOn). Olettaen, että BYTE on char, oikea muunnosmerkki sille on %c

Metabolix [30.04.2007 15:50:35]

#

Mutta %c ei lue sitä lukuna vaan merkkinä. Lue siis ensin int-muuttujaan (&apuluku) ja siirrä siitä (TempOn = apuluku).

tim16 [01.05.2007 14:08:31]

#

moi,
Jep toi pelas, mutta ongelmana on saada luettuna 'bufferista' vain kokonaisluvut. Ok bufferi sisältää hexana:
54 65 6D 70 4F 6E 2C 54 65 6D 70 4D 69 6E 2C 54 65 6D 70 4D61 78 0D 0A
31 2C 2D 32 35 2C 37 30 0D 0A 31 2C 2D 32 35 2C 37 30 0D 0A, eli
TempOn,TempMain,TempMax,1,-25,70
välilyönnit hexalukujen väleissä vain luettavuuden ymmärtämiseksi.
SD-kortin sisältö:
TempOn,TempMin,TempMax (rivi 1, aina samat)
1,-25,70 (rivi 2, muuttuu käyttäjän muutettua)

Nyt haluan vain saada luetuksi nuo kokonaisluvut tuolta bufferista.
Kysyn pitääkö minun lukea ensin tuo rivi 1 ja verrata niiden muuttujia ohjelmassa oleviin muuttujiin. Ja kun löytyy sama, niin sen jälken haetaan sitä vastaava arvo SD-kortista?

Nyt tulokseki tulee vain nollaa(0 0 0).

Kertokaa nyt olenko ihan metsässä vai muuten vaan en ymmärrä asiaa : )

t Timo

Metabolix [01.05.2007 14:10:18]

#

Selitäpä jotenkin ymmärrettävästi. Onko niillä ensimmäisen rivin teksteillä mitään merkitystä ohjelmasi kannalta? Jos ei, voit hypätä suoraan niiden yli.

tim16 [01.05.2007 14:50:44]

#

moi,

No ei oikeastaan, koska rivi 1 pysyy aina samana. Riville tulee tietysti paljon enemmän muuttujia ja se oli mulla mielessä, että jos ne eivät ole aina samassa järjestyksessä, niin silloinhan rivillä 1 olisi myös merkitystä.
Mutta lähdetään nyt siitä, että rivi 1 pysyy vakiona aina. Eli SD-kortille kirjoitetaan käyttöliittymästä .CSV tiedosto pilkkuerottimena, joka sisältää esim. em. nimet ja muuttujien arvot. Rivi 1 siis vakio, ja rivi 2 muuttuu.

Miksi tämä antaa tulokseksi vain puhdasta nollaa?
sscanf((char*)buf, "%d,%d,%d", &TempHelp, &TempMin, &TempMax);
TempOn=TempHelp;
rprintf("%d %d %d",TempOn,TempMin,TempMax);

t Timo

Metabolix [01.05.2007 15:07:18]

#

Varmaankin siksi, että puskurissasi on ensin nuo turhat tekstit, jolloin lukeminen tyssää siihen. Etsi ensin toisen rivin alku ja lue vasta siitä kohti. Käsittääkseni myös tällaisen pitäisi toimia: sscanf((char*)buf, "%*s %d,%d,%d", ja samat muuttujat yhä. %*s siis lukee yhden sanan (eli seuraavaan väliin tai rivinvaihtoon asti), ja * kertoo, ettei sitä tallenneta minnekään.

tim16 [01.05.2007 15:22:39]

#

moi,

Jees tämä pelasi mainiosti. Oikein paljon kiitoksia, kun näin työväen juhlan aikaan sain näin hyvää apua.

Isot plussat auttajille : )

t Timo


Sivun alkuun

Vastaus

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

Tietoa sivustosta