• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Modyfikacja programu(odczytywane danych z pliku)

Object Storage Arubacloud
0 głosów
335 wizyt
pytanie zadane 30 listopada 2017 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam zadanie polega na modyfikacji programu. Tym razem program ma odczytywać dane z gotowego pliku. Wszystko jest przygotowane jednak taką modyfikację robię pierwszy raz i do końca nie wiedziałem jak się do tego zabrać.

Oto kod pliku do z modyfikowania:

#include <iostream>
#include <cstring>
struct wspaniali
{
    std::string nazwiska[200];
    double wplaty[50];
};//struktura wspaniali

int main()
{
    int licz, i ;
    wspaniali * ps = new wspaniali; // alokacja dynamiczna na strukture wspaniali
    std::cout << "Podaj nazwisko i kwote (Zatwierdz \"Enter\")\n";
    std::cin >> licz;

    for(i=0; i < licz; i++)
    {
        std::cin.ignore(1);
        std::getline(std::cin, ps->nazwiska[i]);
        std::cin >> ps->wplaty[i];
    }
    for(int j=0; j < licz; j++)
    {
        std::cout << std::endl;
        if (ps->wplaty[j] >= 10000)
            {
                std::cout << "Nasi Wspaniali Sponsorzy\n" << ps->nazwiska[j] << "\t" << ps->wplaty[j] << "\n";
            }//if
        else if (ps->wplaty[j] < 10000)
            {
                std::cout << "Nasi Sponsorzy\n" << ps->nazwiska[j] << "\t" << ps->wplaty[j] << "\n";
            }// else if
        else std::cout << "Zle dane!";//else
    }
    std::cout << "\n\n\t\tKoniec programu.";
    return 0;
}

Oto próba modyfikacji, nie pokazuje błędów jednak nie odczytuje danych, powodem może być brak warunków pętlach for, próbowałem wielu sposobów jednak nie wiem co mogłoby pomóc:

#include <iostream>
#include <cstring>
#include <fstream>
struct wspaniali
{
    std::string nazwiska[200];
    double wplaty[50];
};//struktura wspaniali

int main()
{
    int licz, i ;

    std::fstream zPliku;
    zPliku.open("ztekstem.txt", std::ios::in); // laczenie plikow

    wspaniali * ps = new wspaniali; // alokacja dynamiczna na strukture wspaniali
    std::cout << "Podaj nazwisko i kwote (Zatwierdz \"Enter\")\n";
    			//wprowadzic dane z pliku
   
    while(zPliku.good())
    {
	   for(i=0;;i++)
	   {
		   zPliku >> ps->wplaty[i];
		   zPliku >> ps->nazwiska[i]; // pobieranie pierwszej nazwy z pliku
	   }//for

	   for(int j=0;;j++)
	   {
	 	  if (ps->wplaty[j] >= 10000)
          {
            std::cout << "Nasi Wspaniali Sponsorzy\n" << ps->nazwiska[j] << "\t" << ps->wplaty[j] << "\n";
          }//if
          else if (ps->wplaty[j] < 10000)
          {
            std::cout << "Nasi Sponsorzy\n" << ps->nazwiska[j] << "\t" << ps->wplaty[j] << "\n";
          }// else if
         else std::cout << "Zle dane!";//else
	   }//for
      }//while
       	std::cout << "\n\n\t\tKoniec programu.";

    if(!zPliku.is_open())
   {
	std::cout << "Proba otwarcia pliku niepowiodla sie!" ;
	exit(EXIT_FAILURE);
   }

   zPliku.close();
    return 0;
}

 

komentarz 30 listopada 2017 przez Bondrusiek Maniak (61,370 p.)
Mógłbyś wkleić jeszcze co jest w tym pliku, który wczytujesz. Może posiada złą strukturę dlatego program nie działa prawidłowo
komentarz 30 listopada 2017 przez Sic Dyskutant (8,510 p.)
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
550000

 

2 odpowiedzi

+1 głos
odpowiedź 30 listopada 2017 przez Bondrusiek Maniak (61,370 p.)
wybrane 1 grudnia 2017 przez Sic
 
Najlepsza

Witam,

tego typu pętla

for(int j=0;;j++)
{
std::cout << " tutaj jestem" << std::endl;
}

jest nieskończona to znaczy że nigdy się nie zakończy(jak chcesz sprawdzić to sobie to skompiluj). Może to w tym tkwi problem.

Pętla for przyjmuje takie wartości

for(wartość początkowa; warunek zakończenia; krok iteracji)

komentarz 30 listopada 2017 przez Sic Dyskutant (8,510 p.)
myślałem że się domyślisz ... "próbowałem wiele sposób" oznacza to że wiem jak działa pętle tylko co wprowadzić jako warunek pętli tu zaczynają być komplikacje ....
komentarz 30 listopada 2017 przez Bondrusiek Maniak (61,370 p.)

Warunkiem może być np eof() (end of file). Przykład

#include <iostream.h>
#include <fstream.h>
#include <assert.h>

int main(void)
{
     int data;           // file contains an undermined number of integer values
     ifstream fin;     // declare stream variable name

     fin.open("myfile",ios::in);    // open file
     assert (!fin.fail( ));     
     fin >> data;        // get first number from the file (priming the input statement)
                              // You must attempt to read info prior to an eof( ) test.
     while (!fin.eof( ))      //if not at end of file, continue reading numbers
     {
          cout<<data<<endl;    //print numbers to screen
          fin >> data;               //get next number from file
     }
     fin.close( );       //close file
     assert(!fin.fail( ));
     return 0;
}

Więcej info

http://www.cplusplus.com/reference/ios/ios/eof/

komentarz 1 grudnia 2017 przez Sic Dyskutant (8,510 p.)

Postarałem się zmodyfikować program do twojego sposobu, jednak eof() nie zadziałało z niewiadomych powodów:

#include <iostream>
#include <cstring>
#include <fstream>
#include <assert.h>
//struct wspaniali
//{
    std::string nazwiska;
    double wplaty;
//};//struktura wspaniali

int main()
{
    std::fstream zPliku;
    zPliku.open("ztekstem.txt", std::ios::in); // laczenie plikow
    assert(!zPliku.fail());
    
    std::cout << "Podaj nazwisko i kwote (Zatwierdz \"Enter\")\n";
    			//wprowadzic dane z pliku
   zPliku >> wplaty;
   zPliku >> nazwiska;
    while(!zPliku.eof())
    {
	 if (wplaty >= 10000)
         {
            std::cout << "Nasi Wspaniali Sponsorzy\n" << nazwiska << "\t" << wplaty << "\n";
         }//if
         else if (wplaty < 10000)
          {
            std::cout << "Nasi Sponsorzy\n" << nazwiska << "\t" << wplaty << "\n";
          }// else if
         else std::cout << "Zle dane!";//else
	 
	 zPliku >> wplaty;
	 zPliku >> nazwiska;
      }//while
       	std::cout << "\n\n\t\tKoniec programu.";

    if(!zPliku.is_open())
   {
	std::cout << "Proba otwarcia pliku niepowiodla sie!" ;
	exit(EXIT_FAILURE);
   }

   zPliku.close();
   assert(!zPliku.fail());
    return 0;
}

 

komentarz 1 grudnia 2017 przez Bondrusiek Maniak (61,370 p.)
#include<iostream>
#include<fstream>

using namespace std;

int main() {
 std::string nazwiska;
double wplaty;
 ifstream zPliku;
zPliku.open("C:\\Users\\przemyslaw.badaruk\\Desktop\\ererer\\test.txt");

 if( zPliku.is_open()) {
         while (!zPliku.eof()) {
            string linia_pliku;
            getline(zPliku, linia_pliku);
            cout << linia_pliku << endl;

            /*tutaj tworzysz algorytm ktory dzieli string na imie i nazwisko oraz wplaty*/

             if (wplaty >= 10000)
                      {
                         std::cout << "Nasi Wspaniali Sponsorzy\n" << nazwiska << "\t" << wplaty << "\n";
                      }//if
                      else if (wplaty < 10000)
                       {
                         std::cout << "Nasi Sponsorzy\n" << nazwiska << "\t" << wplaty << "\n";
                       }// else if
                      else std::cout << "Zle dane!";//else



}
}
 else
 {
     std::cout << "Proba otwarcia pliku niepowiodla sie!" ;
      exit(EXIT_FAILURE);
 }
zPliku.close();
return 0;
}

Musisz odczytywać jedną linię na iterację. Polecam również zmodyfikować plik wtedy bd łatwiej to rozdzielić.

4 Sam Stone
2000 Freida Flass
100500 Tammy Tubbs
5000 Rich Raptor
550000 Jan Kowalski

 

komentarz 1 grudnia 2017 przez Sic Dyskutant (8,510 p.)
Dziękuję Ci bardzo za pomoc. Udostępniłeś mi mnóstwo informacji.
0 głosów
odpowiedź 30 listopada 2017 przez TyBart Początkujący (260 p.)
Nie rozumiem wskaźników polimorficznych. Bez ich urzycia umiałbym to zrobić.

W domu pokminie, jak nikt nie odpowie:)

Pzdr

Podobne pytania

0 głosów
2 odpowiedzi 397 wizyt
0 głosów
2 odpowiedzi 323 wizyt
pytanie zadane 4 kwietnia 2018 w C i C++ przez Marcin Reguła Początkujący (450 p.)
0 głosów
2 odpowiedzi 234 wizyt
pytanie zadane 19 marca 2021 w C i C++ przez Doge Gaduła (3,370 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...