Problem z kompilacją programu przy wpisywaniu danych do pliku

0

Witam. Zacząłem dopiero programować i jeszcze wiele muszę się nauczyć. Ostatnio jednak jak pisałem program mający za zadanie wylosować mi kod i zapisać go w pliku, wystąpił mi problem z kompilacją. Nigdzie nie udało mi się znaleźć rozwiązania tego problemu. Reinstalacja kompilatora również nic nie dała.

kod:

#include <iostream>
#include <string>
#include <limits>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <stdio.h>




std::string kodowanie()
{
    std::string kod;

     for (int i=0; i<2; i++)
    {
        int * b=new int;
        *b=rand()%10;
        std::string B= std::to_string(*b);
        kod.insert (0,B);
        delete b;
    b = nullptr;
    }




    for (int i=0;i<2;i++)
    {
    int * a= new int;
    *a=rand() %24;
   switch (*a)
   {
   case 0:
      kod.insert (0, "A");
     break;

     case 1:
      kod.insert (0, "B");
     break;

     case 2:
      kod.insert (0, "C");
     break;

     case 3:
      kod.insert (0, "D");
     break;

     case 4:
      kod.insert (0, "E");
     break;

     case 5:
      kod.insert (0, "F");
     break;

     case 6:
      kod.insert (0, "G");
     break;

     case 7:
      kod.insert (0, "H");
     break;

     case 8:
      kod.insert (0, "I");
     break;

     case 9:
      kod.insert (0, "J");
     break;

     case 10:
      kod.insert (0, "K");
     break;

     case 11:
      kod.insert (0, "L");
     break;

     case 12:
      kod.insert (0, "M");
     break;

     case 13:
      kod.insert (0, "N");
     break;

     case 14:
      kod.insert (0, "O");
     break;

     case 15:
      kod.insert (0, "P");
     break;

     case 16:
      kod.insert (0, "R");
     break;

     case 17:
      kod.insert (0, "S");
     break;

     case 18:
      kod.insert (0, "T");
     break;

     case 19:
      kod.insert (0, "U");
     break;

     case 20:
      kod.insert (0, "W");
     break;

     case 21:
      kod.insert (0, "X");
     break;

     case 22:
      kod.insert (0, "Y");
     break;

     case 23:
      kod.insert (0, "Z");
     break;
   }
     delete a;
    a = nullptr;
    }
return kod;
}

bool sprawdzanie( std::string kod)
{
    std::ifstream Tablica;
Tablica.open("Tablica.txt",std::ios::in);

if(Tablica.good()==false){
    std::cout<<"Cos poszlo nie tak przy otwieraniu pliku"<<std::endl;
exit(0);}
std::string tekst;
while(getline(Tablica,tekst))
{
    if(kod==tekst)
    {
        Tablica.close();
        return true;
    }

}
Tablica.close();
return false;
}





int main()
{
srand(time(NULL));
std::string kod,tekst;


    kod=kodowanie();
    std::cout<<kod<<std::endl;


while(true)
{
if(sprawdzanie(kod)==true)
{
    std::cout<<"Oh no!"<<std::endl;
    kod=kodowanie();
    continue;
}
if(sprawdzanie(kod)==false)
{
    std::cout<<"Oh Yay!"<<std::endl;
    break;
}
}

std::ifstream Tablica;
Tablica.open("Tablica.txt",std::ios::out | std::ios::app);
if(Tablica.good()==false)
{
    std::cout<<"Wystapil problem z otworzeniem pliku"<<std::endl;
}

Tablica<<kod; //<<Tu występuje błąd. Nie wiem czemu kompilator nie rozpoznaje operatora "<<"
Tablica.close();






getchar();getchar();
    return 0;
}

Treść błędu: error: no match for 'operator<<' (operand types are 'std::ifstream' {aka 'std::basic_ifstream<char>'} and 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'})|

Wie ktoś może jak to rozwiązać?

4

Bezpośrednia przyczyna błędu: używasz ifstream (input file stream) zamiast ostream (output file stream).

Natomiast cały kod generalnie nadaje się do znaczącej poprawy, a raczej przepisania od nowa, przy czym u początkujących to normalne.

PS: reinstalacja kompilatora to bardzo rzadko sensowny pomysł na błąd kompilacji.

3

Jaki jest cel int * b=new int; i int * a= new int;? Utrudniać czytanie? Zwiększyć szansę na poważny błąd?

To coś zastąpi twój switch

kod.insert (0, 1, 'A' + *a);

A twój błąd jest literówką.
Wpisujesz dane do strumienia wejściowego, czyli zamiast i ma być o :)
https://godbolt.org/z/YdfEGq

0

Okej dzięki wielkie! Jak macie jeszcze jakieś ogólne porady co do usprawnienia kodów to z chęcią przyjmę.

2

Nazewnictwo:

  1. Nie używaj polskiego, pisz wszystko po angielsku — można uznać za wyjątek sytuację, w której jesteś bezwzględnie pewien, że żadna osoba nie władająca polszczyzną nigdy do tego kodu nie zajrzy ani jej się on nie przyda… ale to bardzo mocne wymagania, na których łatwo się przejechać. A i nawet wtedy lepiej pisać po angielsku, żeby wyrabiać nawyk.
  2. Nazwy funkcji powinny być raczej czasownikami — bo opisują, co ona robi. Więc np. kodowanie jest nazwą raczej złą — nie wiem, czy wybiera kodowanie, czy dokonuje kodowania, czy zmienia kodowanie, czy coś jeszcze innego; sprawdzanie podobnie — muszę się wczytać, czy true i false to status tego sprawdzania (czy się powiodło, czy nie), czy rezultat (czy coś jest poprawne, czy nie). No i nie wiem co sprawdza.

Wygląd kodu: masz bardzo złe wcięcia. Czym to robisz, bo chyba każdy edytor, który kojarzę, daje lepsze efekty? Trzeba się wczytać i przyjrzeć, jaki jest przepływ sterowania — ludziom znacznie łatwiej jest zauważyć wcięcie lub jego brak, niż liczyć klamry i patrzeć na średniki.

Nie korzystaj z rand we współczesnym kodzie, użyj random. W pewnych okolicznościach możesz chcieć napisać swoje własne dystrybucje, ale to już mikrooptymalizacja.

To tyle z rzeczy ważnych, kolejne uwagi to kosmetyka — można równie dobrze uważać, że Twoja wersja jest tą lepszą:

  1. Nieskończone pętle to raczej for(;;) niż while(true) — bardzo dawno temu miało to znaczenie, teraz to już kwestia głównie estetyczna, aczkolwiek są statyczne analizatory kodu, które nie lubią tej drugiej formy.
  2. Porównywanie do false raczej powinno być zwykłą negacją !warunek().
1

@Zenek38, trochę zoptymalizowana twoja funkcja kodowanie.

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

char randChar()
{
	static char pool[]="ABCDEFGHIJKLMNOPRSTUWXYZ";
	return pool[rand()%(sizeof(pool)-1)];
}

char randDigit()
{
	static char pool[]="0123456789";
	return pool[rand()%(sizeof(pool)-1)];
}

string kodowanie()
{
	return string {{ randChar(),randChar(),randDigit(),randDigit() }};
}
    
int main()
{
	srand(time(0));
	cout<<kodowanie()<<endl;
	return 0;
}

https://ideone.com/CiZbyD

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