[c/c++] odczytywanie danych z pliku


(Xxx Paka) #1
#include 

#include 

#include 

using namespace std;	


struct wartosci{

	 		  float czas;

	 		  float sila;

	 		  float predkosc;

};


void przekaz(wartosci *dane){

	  FILE *pFile;

	  pFile = fopen ("kom.txt" , "r");

	  char x1[100],x2[100],x3[100],x4[100],x5[100],x6[100],x7[100],txt,txt1,txt2;

	  fgets(x1, 100, pFile);

	  fgets(x2, 100, pFile);

	  fgets(x3, 100, pFile);

	  fgets(x4, 100, pFile);

	  fgets(x5, 100, pFile);

	  fgets(x6, 100, pFile);

	  fgets(x7, 100, pFile);

	  /* cout<
        cout<
        cout<
        cout<
        cout<
        cout<
        cout<
	  */

 	  sscanf(x2,"%s %f",txt,&dane->czas);

  	  sscanf(x4,"%s %f",txt1,&dane->sila);

	  sscanf(x7,"%s %f",txt2,&dane->predkosc);

	  fclose (pFile);

}




int main(int argc, char *argv[])

{

 	 wartosci dane;

 	 wartosci *pwartosci;

 	 pwartosci=&dane;

  	 FILE * pFile;

	 pFile = fopen ("kom.txt" , "r");


	 przekaz(&dane);

 	 fclose (pFile);

 	 system("pause");

    return 0;

}

.txt

#komentarz1

czas 0.1

#komentarz 2

sila 99.4

#sd

#

# komentarz 3

predkosc 4.5

program sie wysypuje - nie pokazuje bledu, sprawdzalem w visualu

Run-Time Check Failure #3 - The variable 'pFile' is being used without being initialized.

troszke pozmienialem ale wciaz to samo, wysypuje sie na sscanf nie mam pojecia czy to wciaz ten sam blad

program ma przepisac wartosci do struktury, chcialem na poczatku zrobic to troche porzadniej typu wczytywanie wszystkich lini w petli nastepnie zignorowanie wszystkich lini rozpoczynajacych sie od # , ale juz poszedlem troche na lenia i tak zostalo

mam jeszcze jedno pytanie gdzie w dev c++ znajde cos takiego jak breakpoint ktory jest na wierzchu w visualu ?


(etam) #2

Błąd masz w tym, że txt, txt1 i txt2 są typu char, czyli są pojedynczymi znakami. W twoim przypadku trzecim argumentem do sscanf powinien być bufor na ciąg znaków przkazany jako char*. Kompilator nie sprawdza typów przekazywanych do sscanf (i wszystkich innych używających “…”), dlatego program się wysypuje.

Proponuję zamiast masochizowania się fopenami i scanfami, użyć z biblioteki standardowej c++ fstream, string i ewentualnie stringstream.


(Xxx Paka) #3

ogolnie to te txt nie sa mi do niczego potrzebne, ale znajduja sie na poczatku lini, wiec wystaczy to wrzucic do stringa i chyba tyle?

tak, tez tak myslalem po 5h siedzenia nad podobymi zadaniami , niestety musze to umiec zreszta jak to zrozumiem to na gotowej bibliotece bedzie jeszcze prosciej :slight_smile:

sprawdze rano, bo teraz juz ide spac

ok 11 napisze czy dziala :smiley:


([alex]) #4

To co zrobiłeś jest straszne.

#include 

#include 

using namespace std;   


struct wartosci

  {

   float czas,sila,predkosc;

  };


void czytaj(wartosci &dane,const char *plik)

  {

   FILE *pf=fopen(plik,"r");

   while((pf)&&(!feof(pf)))

     {

      char buf[200];

      fgets(buf,200,pf);

      sscanf(buf," czas %f",&dane.czas);

      sscanf(buf," sila %f",&dane.sila);

      sscanf(buf," predkosc %f",&dane.predkosc);

     }

   if(pf) fclose(pf);

  }


int main(int argc, char *argv[])

  {

   wartosci dane={0,0,0}; // tu domyślne wartości

   czytaj(dane,"kom.txt");

   printf("czas=%f, sila=%f, predkosc=%f\n",dane.czas,dane.sila,dane.predkosc);

   getchar();

   return 0;

  }

Czy masochizowanie z biblioteką standardową c++ fstream, string i ewentualnie stringstream będzie miało prostszy kod? Aha, zapomniałem będzie dziesięć klas, dwa razy tyle kodu ale będzie prostsze :stuck_out_tongue_winking_eye:


([alex]) #5

Chciał bym to zobaczyć. Albo będzie dłuższe albo słabsza funkcjonalność.


(etam) #6

Częściowo masz rację. sscanf’y wygrywają tę rundę, ale fopen i fgets nie.

#include 

#include 

#include 


struct wartosci

{

    float czas,sila,predkosc;

};


void czytaj(wartosci &dane, const char *nazwa_pliku)

{

    std::ifstream plik(nazwa_pliku);

    while (plik) {

        std::string buf;

        std::getline(plik, buf);

        std::sscanf(buf.c_str(), "czas %f", &dane.czas);

        std::sscanf(buf.c_str(), "sila %f", &dane.sila);

        std::sscanf(buf.c_str(), "predkosc %f", &dane.predkosc);

    }

}


int main()

{

    wartosci dane={0,0,0}; // tu domyślne wartości

    czytaj(dane,"kom.txt");

    std::cout << "czas=" << dane.czas << ", sila=" << dane.sila <<", predkosc=" << dane.predkosc << std::endl;

    return 0;

}

([alex]) #7
#include 

#include 

using namespace std;   


struct wartosci

  {

   float czas,sila,predkosc;

  };


void czytaj(wartosci &dane,const char *plik)

  {

   FILE *pf=fopen(plik,"r");

   char buf[200];

   while((pf)&&(!feof(pf))&&(fgets(buf,200,pf)))

     {

      sscanf(buf," czas %f",&dane.czas);

      sscanf(buf," sila %f",&dane.sila);

      sscanf(buf," predkosc %f",&dane.predkosc);

     }

   if(pf) fclose(pf);

  }


int main(int argc, char *argv[])

  {

   wartosci dane={0,0,0}; // tu domyślne wartości

   czytaj(dane,"kom.txt");

   printf("czas=%f, sila=%f, predkosc=%f\n",dane.czas,dane.sila,dane.predkosc);

   getchar();

   return 0;

  }