Avatar billede baltazar_ Nybegynder
25. oktober 2002 - 22:52 Der er 42 kommentarer og
1 løsning

Stream spørgsmål

Jeg har lavet flg. kode. Men der er noget helt galt og jeg kan ikke finde ud af hvorffor den ikke virker.

Det er menningen den skal læse teksten der forkommer mellem de 2 første kommaer i første sætning i filen

Det skal lige nævnes jeg bruger DEV C++ compileren - Det er sgu nok derfor *G*
Den siger der er parametre som ikke er i orden og lidt andet. Men jeg kan ikke gennemskue det

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

using namespace std;

int main() {

ifstream fin("data\test.txt"); // file - location of stream file
string data[2];
if (fin) {
int c = 0;

char ch; /* declares char variable */
while (fin.good()) {
fin.get(ch); // Read one character

if (ch != ',') // If it is _not_ a comma
data[c] += ch; // Append character
else { // Character is a comma
if (c<2) c++; // If this is the first comma, move to second "data holder"
else break; // Second comma found, we be done - yo.
}
}
}
else
cout << "Couldn't open file, foo!\n";
}
return 0;
}
Avatar billede mbulow Nybegynder
25. oktober 2002 - 23:08 #1
Nu har jeg ikke lige testet dit program igennem, om det virkelig gør som planlagt, men et par ting som du ihvert SKAL rette for at få det til at kompilere er:

1) Slet den } der står på linjen lige over return 0;
2) #include <fstream>
3) #include <string>

Ud over det kan jeg foreslå følgende ændringer:

4) #include <iostream> istedet for <iostream.h> (Altså fjern .h i navnet)
5) Du har ikke noget at bruge #include <stdio.h> og #include <stdlib.h> til
Avatar billede mbulow Nybegynder
25. oktober 2002 - 23:13 #2
Hov den her havde jeg ikke lige set...

For at skrive en \ i en streng skal du skrive \\
Altså: ifstream fin("data\\test.txt");

\ bruges i forbindelse med 'escape characters' (specialtegn), som f.eks. \n (ny linje). Derfor betyder det du havde skrevet:

data    est.txt  (De 4 mellemrum er et tabulator)
Avatar billede baltazar_ Nybegynder
25. oktober 2002 - 23:15 #3
Okey nu kom den ned på 4 fejl *G*

den skriver :
og hentyder til den linie i includefilen BASTRING
FRA INCLUDE FIL ---- 
virtual streampos  _Cdecl seekoff(streamoff, seek_dir, int);

og så nævner den en pass error >
i denne include fil ( er min include defekt eller sådan noget ? )
Avatar billede baltazar_ Nybegynder
25. oktober 2002 - 23:18 #4
compiler skriver således

C:/Dev-Cpp/include/g++-3/std/bastring.h:65: parse error before `>'
C:/Dev-Cpp/include/g++-3/std/bastring.h:71: confused by earlier errors, bailing out

make.exe: *** [uuuuuuuuu.o] Error 1

Eksekvering afbrudt
Avatar billede baltazar_ Nybegynder
25. oktober 2002 - 23:20 #5
okey den med \ var en tanke torsk -  men jeg har også influenza *G*
det er noget af det jeg langt om længe HAR fået styr på efterhåneden

nu mangler jeg bare resten af c++ sproget *G*
Avatar billede mbulow Nybegynder
25. oktober 2002 - 23:20 #6
Øh bøh... :)

Prøv lige med det her stykke kode...
Jeg har godt nok omskrevet det en lille bitte smule men det kompilerer fint:

#include <fstream>
#include <iostream>
#include <string>

int main(){
    std::ifstream fin("data\\test.txt");
    if(fin.is_open()){
        std::string data[2];
        int c = 0;
        char ch;
        while(fin.good()){
            fin.get(ch);
            if(ch != ',')
                data[c] += ch;
            else
                if(c<2)
                    c++;
                else
                    break;
        }
    }
    else
        cout << "Couldn't open file, foo!\n";
    return 0;
}
Avatar billede baltazar_ Nybegynder
25. oktober 2002 - 23:22 #7
det giver nøjagtigt de samme fejl som den jeg lige ændrede på  underligt ik ?
Avatar billede mbulow Nybegynder
25. oktober 2002 - 23:25 #8
Øhh... Jo, absolut... Hvilken version af Dev-C++ bruger du?

Jeg har selv oplevet nogle små problemer med version 4, så jeg bruger nu selv version 5. Selvom den stadig er i Beta har jeg ikke oplevet nogle problemer endnu
Avatar billede baltazar_ Nybegynder
25. oktober 2002 - 23:28 #9
vers. 4.9.60
jeg har lige opgraderet for 2 timer siden ( med upgraderings modulet i programmet )
Avatar billede mbulow Nybegynder
25. oktober 2002 - 23:42 #10
Så fatter jeg godt nok minus :/

Jeg har selv lige downloadet den samme version... Godt nok via Bloodshed's site, da den der upgraderings fætter ikke virkede ordentligt.

Det virker stadig som det skal.

Det mest sørgelige er at den ikke giver kompilerfejl pga den sidste cout, i det stykke kode jeg har lagt til dig.
Jeg har nemlig lige opdaget at jeg har glemt at ændre den sidste fra:
    cout
til
    std::cout

Med prøv lige at ret det... Kan jo være noget galt med min installation, og det er derfor din kompiler brokker sig
Avatar billede baltazar_ Nybegynder
25. oktober 2002 - 23:46 #11
det er stadigt det samme - :(
Avatar billede baltazar_ Nybegynder
25. oktober 2002 - 23:50 #12
så vidt jeg kan forstå på compileren så har det noget at gøre med den måde jeg vader rundt i streamet på. men HVAD - den er lige lovlig flabet *G*
Avatar billede baltazar_ Nybegynder
25. oktober 2002 - 23:55 #13
den skriver :

Building Makefile: "C:\Dev-Cpp\Makefile.win"
Eksekverer  make...
make.exe -f "C:\Dev-Cpp\Makefile.win" all
gcc.exe -c MAIN.C -o MAIN.o -I"C:/Dev-Cpp/include"  -g3

In file included from C:/Dev-Cpp/include/fstream.h:10,
                from C:/Dev-Cpp/Bin/../lib/gcc-lib/mingw32/2.95.3-6/../../../../include/g++-3/fstream:6,
                from MAIN.C:1:
C:/Dev-Cpp/include/iostream.h:243: type specifier omitted for parameter
In file included from C:/Dev-Cpp/Bin/../lib/gcc-lib/mingw32/2.95.3-6/../../../../include/g++-3/fstream:6,
                from MAIN.C:1:
C:/Dev-Cpp/include/fstream.h:44: type specifier omitted for parameter

In file included from C:/Dev-Cpp/Bin/../lib/gcc-lib/mingw32/2.95.3-6/../../../../include/g++-3/string:6,
                from MAIN.C:3:
C:/Dev-Cpp/Bin/../lib/gcc-lib/mingw32/2.95.3-6/../../../../include/g++-3/std/bastring.h:65: parse error before `>'
C:/Dev-Cpp/Bin/../lib/gcc-lib/mingw32/2.95.3-6/../../../../include/g++-3/std/bastring.h:71: confused by earlier errors, bailing out

make.exe: *** [MAIN.o] Error 1

Eksekvering afbrudt
Avatar billede mbulow Nybegynder
26. oktober 2002 - 00:00 #14
Nu er jeg godt nok ved at være løbet tør for idéer, så som de sidste desperate forsøg:

- Prøv at sende alt hvad du har til mig her: mbulow@mail.tele.dk
- Prøv engang at slette din Dev-C++, og download og installer den nyeste fra Bloodshed (Altså ingen opgradering. Kan jo være opgraderingen der er gået rod i)
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 00:07 #15
jeg prøver - har sendt dig en mail
Avatar billede mbulow Nybegynder
26. oktober 2002 - 00:13 #16
Hov... Du glemte vist lige noget :) hehe

Jeg fik kun din .dev-fil

Men hvis din .cpp-fil er 100% magen til det jeg postede tidligere (med cout ændret til std::cout) behøver du ikke maile det igen, for jeg prøvede bare med min egen fil, i dit projekt, og det virkede fint
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 00:14 #17
den er nøjagtig identisk
Avatar billede mbulow Nybegynder
26. oktober 2002 - 00:27 #18
Nu ved jeg selvfølgelig ikke hvor langt du er nået, men hvis ikke du har fået uninstallet den gamle Dev-C++ endnu, kan du eventuelt prøve at lave en:
    Kompiler->Rengør projekt

Jeg sad selv lige og pillede lidt ved nogle ting og sager, så der til sidst kom en seriøs bunke fejl, hver gang jeg prøvede at kompilere. Det eneste der virkede var en gang hovedrengøring :)
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 00:37 #19
Jeg fik indstalleret en ny - først gik den nye i ged - gjorde det igen og nu virker det bare derudaf :O)))))))))))))
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 00:39 #20
ups lidt for hurtig . den skrev der var en fejl i programmet og den lukkede den ned ( altså mit lille program ikke dev c++ `en )
Avatar billede mbulow Nybegynder
26. oktober 2002 - 00:48 #21
Det var sgu da bare lækkert at Dev-C++ virker nu... Så er det bare om at få kål på den fejl du snakker om at der er i dit projekt :)

Hvad er det for en fejl du får?

Hvis det er sådan en "Couldn't open file, foo!"-fætter kan du jo prøve at indtaste den absolutte sti til filen, i stedet for den relative... Altså noget i retning af "C:\\Temporary\\test.txt"
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 00:52 #22
den skriver  glenncrash.exe har genereret en fejl og lukkes ned af windows
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 00:52 #23
ud over det ( det gik lidt stærkt ) så så det ud som om det exekvere noget af den. Den compilede uden fejl
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 00:56 #24
den snakker om en segmentation fejl  hvad det så end er ( access violation)
Avatar billede mbulow Nybegynder
26. oktober 2002 - 00:59 #25
Må man spørge hvad der står i den der fil du prøver at åbne? Altså din data\\test.txt... Bare så vi også at den samme test-fil at gå ud fra :)
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 01:01 #26
ja da  jeg kan sende den til dig  2 sek
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 01:03 #27
den er sendt til dig
Avatar billede mbulow Nybegynder
26. oktober 2002 - 01:03 #28
Yikes... Vent lige lidt... Det er da på grund af din:

if(c < 2)
    c++;

Hvad sker der når den finder komma nummer to i filen (dvs. c == 1)... Så sætter den c til 2, og prøver at accesse data[2], og siden data er defineret som:

std::string data[2];

er der jo kun:

data[0] og data[1]
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 01:05 #29
hmm okey  hvad faen gør vi  trode det gjorde at den læste hvad der lå imellem komma 1 og komma to.  Jeg trode jeg havde været smart *G*
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 01:07 #30
den skal jo faktiskl stoppe ved c=1 og derefter læse indtil c=2
Avatar billede mbulow Nybegynder
26. oktober 2002 - 01:09 #31
Det er også smart nok, du skal bare ændre:
  if(c < 2)
til
  if(c < 1)



Jeg har ændret lidt i koden, bare for at kunne udskrive den sætning programmet finder frem til:

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

int main(){
    std::ifstream fin("C:\\test.txt");
    if(fin.is_open()){
        std::string data[2];
        int c = 0;
        char ch;
        while(fin.good()){
            fin.get(ch);
            if(ch != ',')
                data[c] += ch;
            else
                if(c < 1)
                    c++;
                else
                    break;
        }
        std::cout << data[1] << std::endl;
    }
    else
        std::cout << "Couldn't open file, foo!\n";
    system("pause");
    return 0;
}
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 01:10 #32
hvis jeg laver den om till c--  så er der igen fejl så du havde ret  det var den der var den store LORT *G*
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 01:11 #33
YES  det kører KANOOON  hold da op en kamp
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 01:12 #34
så skal jeg bare have den til at læse lidt længere henne, det skal nok blive mindst lige så sjovt
Avatar billede mbulow Nybegynder
26. oktober 2002 - 01:14 #35
Det der sker er at programmet indlæser et tegn af gangen, i data[0], indtil det finder et ','
Derefter sætter den c til 1, og indlæser til data[1], indtil det næste komma, og så skal programmet bare afsluttes, uden at tænke nærmere over det komma :)

Husk at arrays altid starter med index 0. Dvs. hvis du opretter et array med n elementer kan du indexere fra 0 til n-1
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 01:15 #36
det glemmer jeg hver gang - nok derfor det gik så galt
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 01:24 #37
hvordan rykker vi den længere frem uden at den går amok igen

hvis jeg hæver c<1  til et højere tal er den jo gal igen
Avatar billede mbulow Nybegynder
26. oktober 2002 - 01:42 #38
Jeg har lige skrevet lidt om...
Sådan som jeg har lavet det nu, finder det frem til komma nummer 'firstComma', og indlæser indtil det finder det næste.

Sikkert ikke den mest optimale løsning i betragtning af hvad tid det er på døgnet, men det gør ihvert fald som planlagt :)



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

int main(){
    std::ifstream fin("C:\\test.txt");
    if(fin.is_open()){
        std::string data;
        char ch;
        int firstComma = 2;
        int currentComma = 0;
        while(fin.good()){
            fin.get(ch);
            if(currentComma < firstComma){
                if(ch == ',')
                    currentComma++;
            }
            else
                if(ch != ',')
                    data += ch;
                else
                    break;
        }
        std::cout << data << std::endl;
    }
    else
        std::cout << "Couldn't open file, foo!\n";
    system("pause");
    return 0;
}
Avatar billede mbulow Nybegynder
26. oktober 2002 - 01:57 #39
Her har du en langt bedre version.
Den her version indlæser automatisk til den finder et ',' (se getline-funktionen).
Dvs, det er ikke nødvendigt selv at indlæse hvert enkelt tegn og se om det er et komma :)



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

int main(){
    std::ifstream fin("C:\\test.txt");
    if(fin.is_open()){
        std::string data;
        int currentComma = 0;
        int firstComma = 1;
       
        while(fin.good()){
            std::getline(fin, data, ',');
            if(currentComma < firstComma)
                currentComma++;
            else
                break;
        }
       
        std::cout << data << std::endl;
    }
    else
        std::cout << "Couldn't open file, foo!\n";
    system("pause");
    return 0;
}
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 02:09 #40
den er super lige hvad jeg skule bruge. Så kan jeg smide værdien af kommaerne ind i et array og udskirve mere en en værdi .. stærkt
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 02:16 #41
har du nogle sinde arbejdet med at hente data fra en seriel port. Mere hvis du kender en dansk tut på det for consol.

Har ledt over alt for at finde en
Avatar billede mbulow Nybegynder
26. oktober 2002 - 12:43 #42
Seriel port: Nope desværre... Aldrig noget jeg har roder med, eller set tutorials til
Avatar billede baltazar_ Nybegynder
26. oktober 2002 - 12:49 #43
øv for jeg har lavet en A/D converter som jeg ikke er sikker på virker ordentligt og ville gerne læse de data den smider ( hvis den smider noget *G* )

anyway  mange tak for hjælpen i går, jeg sov rigtigt godt efter den nød var knækket :O) .
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