Funkcja nic nie wypisuje

0
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>


using namespace std;


bool ZapiszTablice(string nazwa_pliku)
{
    ifstream plik(nazwa_pliku.c_str());
    if(!plik) return false;
    else
    {
        unsigned int rozmiar = 1;
        unsigned int suma = 0;
        unsigned int liczba = 0;
        int *T = new int [rozmiar];
        while(true)
        {
            if(!plik.eof())
            {
                for(int i = 0; i < rozmiar; ){
                    plik.clear();
                    plik >> liczba;
                    if(!plik.fail())
                    {
                        T[i]=liczba;
                        suma ++;
                        rozmiar++;
                        i++;
                    }
                    else continue;
                }
            }
          else
            break;
        }
        cout << suma << endl;
    }
    return true;
}

//void WypiszTablice()
int main(){
    if(ZapiszTablice("Dodawanie.txt"))
        cout << "Koncze dzialanie";
    else
        cout << "Nie udalo sie otworzyc pliku";

    getch();
    return 0;
}

bląd musi leżeć gdzieś tutaj ponieważ w ogole nie wypisuje nic na print it.

if(!plik.fail())
                    {
                        T[i]=liczba;
                        suma ++;
                        rozmiar++;
                        i++;
                    }

EDIT: program ma wczytywac tylko cyfry spośród znakow pliku tekstowego.

3

Pozwól że ci to obrazowo wytłumaczę, kupujesz w sklepie jednego snikiersa, na paragonie właśnie tak masz napisane, po czym wychodzisz ze sklepu, dopisujesz do paragonu cyfrę zero aby wyszło że kupiłeś 10 snikersów i dziwisz się czemu w kiszeni masz wciąż jednego?

unsigned rozmiar=1;
int *T = new int [rozmiar];
rozmiar=1000000000; // teraz rozmiar ma wartość milion zaś T nadal ma jeden element
0

nie powinien zatem wypisac liczbe elementow czyli w tym przypadku 1?
jak umieszcze tworzenie tablicy w petli for również nic nie wypisze...
choć w tym przypadku to bzdurne rozwiązanie zeby nadpisywac tę samą tablicę przypisując jednoczesnie kolnejny jej element...

może macie jakies rozwiązanie? będę wdzięczny (jak zawsze)..

0

Musisz wybrać jeden ze sposobów:

  1. Pozbyć się tablicy i działać online
  2. Przejść na tablice która ma już opracowane rozszerzenie vector<> (lub też wybrać list<>).
  3. Samodzielnie zaimplementować rozszerzenie tablicy
0

Dobra, więc rozwiązałem troche inaczej mój problem:

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

/*1. Napisz program, który wczyta z pliku liczby całkowite i wypisze je na ekranie. Wszelkie nieprawidłowe znaki mają zostać pominięte. Program ma wypisać również sumę wszystkich wczytanych liczb. Przykładowa zawartość pliku z danymi:
a 1 2 321b9 ac.de ef#@g 5 #3
Oczekiwane standardowe wyjście programu dla przykładowego zestawu danych:
1 2 321 9 5 3
Suma liczb wynosi: 341 */

using namespace std;





bool odczytaj(string nazwa_pliku){
ifstream plik(nazwa_pliku.c_str());
if(!plik.good()) return false;
else{
    int liczba = 0;
    int suma = 0;
    while(true){
            if(!plik.eof()){
                plik.sync();
                plik >> liczba;
                if(!plik.fail())
                {
                    cout << liczba << " ";
                    suma += liczba;
                }
                else continue;
            }
            else{
                    cout << "\nSuma wczytanych liczb: " << suma << endl;
                    break;
            }
    } // while(true)
     return true;
}
}

int main()
{
    if(odczytaj("Dodawanie.txt"))
        cout << "\nKoniec pliku";
    else cout << "Nie udalo sie otworzyc pliku Dodawanie.txt ";

    getch();
    return 0;
}

Jak trafia na inny znak niż liczba to nic nie wypisze. Może dlatego, ze nie wiem jak dokładnie działa zczytywanie do zmiennej ze strumienia?

0

Nie usuwasz flagi blędów strumienia po trafieniu na nie-liczbę
Zabezpieczenie przed wpisywaniem liter

3
#include <iostream>
#include <fstream>
using namespace std;

int main()
  {
   ifstream fin("Dodawanie.txt");
   if(!fin) cout << "Nie udalo sie otworzyc pliku Dodawanie.txt ";
   else
     {
      int sum=0;
      while(fin)
        {
         int num;
         if(fin>>num) sum+=num;
         else
           {
            fin.clear();
            fin.get();
           }
        }
      cout<<"Suma liczb wynosi: "<<sum<<endl;
     }
   //cin.get(); // ale o to IDE musi zadbać
   return 0;
  }
0

Dzięki,
Tak sie tylko zastanawiam czy tylko fin.get() zmienia pozycje do następnego znaku w przypadku blędnego wczytania. Dlaczego nie mogło to robić continue -> fin >> liczba + czyszczenie flagi błędu oraz strumienia bufora.

2

Bo jak nie uda się wczytać ze strumienia (bo chciałeś liczbę a była literka) to ta literka w buforze pozostaje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1