Avatar billede narrr Nybegynder
09. april 2003 - 18:44 Der er 8 kommentarer og
2 løsninger

fscanf i c++

Findes der ikke noget i c++, der svarer til C's fscanf? Jeg skal loade strengen "2/3 4/5" ind fra en fil, og det kan man jo gøre ved at sætte formatet til "%i/%i %i/%i", men jeg vil gerne lave det med C++ ....
Avatar billede arne_v Ekspert
09. april 2003 - 18:49 #1
Jo.

fscanf !
Avatar billede arne_v Ekspert
09. april 2003 - 18:49 #2
Du kan også bruge stdio i C++.
Avatar billede soreno Praktikant
09. april 2003 - 18:50 #3
Du kan f.eks. bruge << på en string.

#include <string>
using namespace std;
[..]
string test;
test << var1 << "/" << var2 << " " << var3 << "/" << var4;
Avatar billede segmose Nybegynder
10. april 2003 - 08:34 #4
smart! hvordan checker du så for fejl?
Avatar billede olennert Nybegynder
10. april 2003 - 10:05 #5
soreno> Er operator<< defineret for std::string? Jeg troede du skulle bruge ostringstreams til den slags?

Jeg er slem til ikke at læse spørgsmålet ordentligt, så jeg kan sagtens tage fejl, men jeg tror altså ikke din kode gør det samme som fscanf gør. fscanf læser netop hele strengen fra filen, din kode går ud fra at alt i forvejen er splittet op (i var1, var2, var3 og var4), og så sætter du en streng sammen. Så gør du ikke det modsatte af fscanf? fscanf læser fra en sammensat streng, og "roder" den ud i variabler, du har variablerne, og sætter dem sammen i en streng?
Avatar billede soreno Praktikant
10. april 2003 - 10:23 #6
olennert:

Jow, du har ret.

  1. << er ikke defineret for en string. Det er + til gengæld (det var den jeg ville bruge.. :-)
  2. Min sammenlægger allerede splittede variabler i en streng.
  3. Jeg ved ikke hvordan man kan gøre det i c++ (og kan ikke umiddelbart finde noget i min bog).
Avatar billede arne_v Ekspert
10. april 2003 - 10:27 #7
fscanf er helt legal standard C++.

Og jeg kan ikke se nogen speciel værdi i at lave diverse
krumspring for at skrive C++ med features der ikke er legal
standard C.
Avatar billede soreno Praktikant
10. april 2003 - 10:29 #8
Jeg ved ikke om det kan gøres mere elegant, men det virker:
#include <fstream>

using namespace std;

int main(int argc, char **argv)
{
    ifstream file("test.txt");
    int var1, var2, var3, var4;
    char trash;
    file >> var1;
    file >> trash;
    file >> var2;
    file >> var3;
    file >> trash;
    file >> var4;

    cout << "var1 " << var1 << endl;
    cout << "var2 " << var2 << endl;
    cout << "var3 " << var3 << endl;
    cout << "var4 " << var4 << endl;   
    return 0;
}

test.txt
4/6 2/3

output:
var1 4
var2 6
var3 2
var4 3
Avatar billede olennert Nybegynder
10. april 2003 - 10:40 #9
soreno> Du kan udvide med fejlhåndtering. Efter hver file >> etellerandet; kan du teste på din streams state:

if (!file.good()) { // Der var en fejl i foregående linie }
Avatar billede narrr Nybegynder
16. april 2003 - 23:48 #10
Søren og Arne får points.. Jeg holder mig sgu til fscanf
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester