Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Wczytanie danych

Ostatnio zmodyfikowano 2014-07-07 19:40
Autor Wiadomość
pekfos
» 2014-07-03 21:57:31
1. Zły warunek.
2. Nie inkrementujesz i i również zły warunek, jeśli się czepiać.
P-113236
grzeso
Temat założony przez niniejszego użytkownika
» 2014-07-03 22:06:49
1. czemu zły? przecież
eof
 zwraca true jak znajdzie koniec danych, czyli logicznie zrobiłem żeby sie kończyła petla jak znajdzie koniec
2. jak zainkrementuje "i" to wywala mi program.

a poza tym jak wygląda to tak:
C/C++
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
int main()
{
    fstream plik;
    plik.open( "dane.txt", ios::in );
    if( plik.good() )
    {
        string napis;
        cout << "Zawartosc pliku:" << endl;
        while( !plik.eof() )
        {
            getline( plik, napis );
            cout << napis << endl;
        }
        plik.close();
    } else cout << "Error! Nie udalo otworzyc sie pliku!" << endl;
   
    getch();
    return( 0 );
}
to działa (znaczy nie tak jak chce, ale ogólnie działa)

czyli na logikę zrobiłem tak samo z moja petla
P-113239
pekfos
» 2014-07-03 22:10:02
1. Bo eof() sprawdza się po odczycie, a nie przed.
2. Bo wczytujesz ile wlezie, a w twoje tablice niewiele wlezie..

to działa
Dla odpowiedniego pliku pewnie nie zadziała. Rób tak:
C/C++
while( in >> abc >> def )
//lub
while( std::getline( asd, sdf ) )
//itp
Jeśli wystąpi błąd, plik się skończy itp, a sprawdzenie wystąpi po odczycie, to pętli obsłużysz dane z pewnością, że podczas ich wczytywania nie wystąpił błąd. Czyli dane będziesz mieć poprawne, a nie częściowo wyzerowane, a częściowo pomieszane ze starymi.
P-113242
Monika90
» 2014-07-03 22:16:04
to działa
nie działa, bo może wydrukować na końcu dodatkową pustą linię, której w pliku nie ma, albo nawet gorzej - może się zawiesić
P-113244
grzeso
Temat założony przez niniejszego użytkownika
» 2014-07-03 22:26:32
Tak wyglada mój program, ale nadal są bzdury

C/C++
#include <iostream>
#include <fstream>
#include <iomanip>>

using namespace std;

int main()
{
    double n[ 50 ];
    double x[ 50 ];
    double y[ 50 ];
    char comma;
   
    fstream plik;
   
    plik.open( "dane.txt" );
   
    int i = 0;
    while( plik >> n[ i ] )
    {
        plik >> n[ i ] >> comma >> x[ i ] >> comma >> y[ i ];
        i++;
    }
    plik.close();
   
    for( int j = 0; j < 50; j++ )
    {
        std::cout << x[ j ] << std::endl;
    }
   
    std::cout << std::endl;
   
    for( int j = 0; j < 50; j++ )
    {
        std::cout << y[ j ] << std::endl;
    }
}

ale jeśli:
 
C/C++
int a;
int i = 0;
while( plik >> a )
{
    plik >> n[ i ] >> comma >> x[ i ] >> comma >> y[ i ];
    i++;
}
 
to zadziała pod warunkiem że tablisa są małe, a mi chodzi o to żeby była duża.


Monika90 masz racje, robi się dodatkowa linia



P-113246
Monika90
» 2014-07-03 22:31:35
jęzli dobrze rozmiem o co Ci chodzi to ma być tak
C/C++
int i = 0;
while( i < 50 &&( plik >> n[ i ] >> comma >> x[ i ] >> comma >> y[ i ] ) )
{
    ++i;
}
P-113247
grzeso
Temat założony przez niniejszego użytkownika
» 2014-07-03 22:52:28
no właśnie nie.

to 50 to taki przykład tylko

chodzi o to żeby pętla wczytała tyle danych ile będzie w pliku, nieważne czy będzie ich 50 czy 17tys.

I jeśli zrobię pętle for i ograniczę ile ma być danych to działa, ale nie chce się ograniczać tylko żeby działało dla każdej ilości.

i problemem jest to ze nie umiem zrobić warunku kończącego tą pętle


i w tym co napisałaś jest wszystko fajnie tylko ze jak usunę ograniczenie ze max 50 to program się wywala
P-113248
Monika90
» 2014-07-03 23:01:46

struct Dane
{
    double n, x, y;
};

std::vector<Dane> dane;

i dodajesz elementy do wektora za pomocą push_back
P-113249
1 « 2 » 3 4 5
Poprzednia strona Strona 2 z 5 Następna strona