Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Pomoc] Odczytywanie danych z pliku, zapis do tablicy.


Rekomendowane odpowiedzi

Opublikowano

Cześć wszystkim, jako iż marny ze mnie programista - dopiero zaczynam (II LO) napotkałem problem w trakcie pisania programu.

Jest to sklejka różnych programów, ponieważ nie posiadam wiedzy na temat otwierania plików i wybierania z nich danych.

Program ma chyba dosyć łatwe zadanie - wczytuje dane z pliku txt (dwie kolumny ze słowami [pierwsza po ang, druga po polsku]) i zapisuje je w dwóch tablicach - nie chcę się bawić w tablice dwuwymiarowe.
Potem losuje jakieś słowo i sprawdza czy użytkownik poprawnie je przetłumaczył.

 

  1. #include <fstream>
  2. #include <iostream>
  3. #include <conio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. using namespace std;
  7. int main()
  8. {
  9. int i=0,x=0,temp, y=0,los,los2;
  10. char o;
  11. string z,tlum;
  12. std::fstream slowka;
  13. slowka.open( "slowka.txt", std::ios::in);
  14. if( slowka.good() == true )
  15. {
  16. slowka.seekg (0, slowka.end); // Sprawdzanie
  17. x = slowka.tellg(); // Ilosci wersow
  18. slowka.seekg (0, slowka.beg); // W pliku
  19. }
  20. else
  21. cout << "Nie mozna odnalezc pliku";
  22. string ang[x],pol[x];
  23. while (!slowka.eof())
  24. {
  25. for(int i=0;i<=x;i++)
  26. {
  27. slowka >> ang[i] >> pol[i];
  28. }
  29. slowka.close();
  30. }
  31. for(int i=0;i<=x;i++) // <----- To wykona i się sypie
  32. {
  33. cout <<"\n"<<ang[i]<<" "<<pol[i];
  34. }
  35. srand(time(NULL));
  36. cout <<"Wdus T, jesli chcesz wylosowac slowo, wdus N, jesli chcesz wyjsc";
  37. cin >> o;
  38. while (o="T" || "t")
  39. {
  40. los=rand()%x;
  41. los2=rand()%2;
  42. if (los2==1)
  43. {
  44. cout << "Podaj tlumaczenie podanego slowa: " << ang[los];
  45. cin >> tlum;
  46. if (tlum==pol[los])
  47. cout <<"Poprawnie przetlumaczone !";
  48. }
  49. else
  50. {
  51. cout << "Podaj tlumaczenie podanego slowa: " << pol[los];
  52. cin >> tlum;
  53. if (tlum==ang[los])
  54. cout <<"Poprawnie przetlumaczone !";
  55. }
  56. cout <<"Wdus T, jesli chcesz wylosowac slowo, wdus N, jesli chcesz wyjsc";
  57. cin >> o;
  58. }
  59. getch();
  60. }

 

​Jeśli można prosić o pomoc i wyjaśnienie co dlaczego jest złe, byłbym serdecznie wdzięczny :)

"The only person you should try to be better than is the person you were yesterday."

Opublikowano

 

Sprawdź jak długi jest plik, bo jak rand wylosuje jakąś liczbe z kosmosu to to się wysypie, na dodatek jak porównujesz z charem to:

char o = 'T'
NIE char o = "T"

 

 

 

  1. {
  2. slowka.seekg (0, slowka.end); // Sprawdzanie
  3. x = slowka.tellg(); // Ilosci wersow
  4. slowka.seekg (0, slowka.beg); // W pliku
  5. }

To sprawdza długość pliku.

 

Teraz tak, program wiesza się po wypisaniu tablicy, czyli po tym momencie:

 

 

 

  1. for(int i=0;i<=x;i++) // <----- To wykona i się sypie
  2. {
  3. cout <<"\n"<<ang[i]<<" "<<pol[i];
  4. }

"The only person you should try to be better than is the person you were yesterday."

Opublikowano
Opublikowano

Czyli coś w ten deseń :

string z;
while( !slowka.eof() )
      {
            getline( slowka, z );
            slowka << x<<z << "\n";
            x++;
      }

Tylko teraz pozostaje jeszcze kwestia cofnięcia się do początku pliku, z czym sobie poradzić nie mogę :)

"The only person you should try to be better than is the person you were yesterday."

Opublikowano

Przecież już to robiłeś wcześniej

slowka.seekg (0, slowka.beg); // W pliku

Nie wiesz co piszesz?

 

 

 

Pozwolę sobie zacytować samego siebie :

 

Cześć wszystkim, jako iż marny ze mnie programista - dopiero zaczynam (II LO) napotkałem problem w trakcie pisania programu.

Jest to sklejka różnych programów, ponieważ nie posiadam wiedzy na temat otwierania plików i wybierania z nich danych.

 

Ale dzięki za pomoc :) Jak jakieś problemy po drodze napotkam, zgłoszę się jeszcze, więc nie znacie dnia ani godziny, o której znów was załamię ^^

 

"The only person you should try to be better than is the person you were yesterday."

Opublikowano

Ale miałeś ten fragment w swoim kodzie, więc nie wymiguj się tym, że jesteś początkujący. Jak kopiujesz jakiś program to powinieneś dociec co on robi i dlaczego.

Opublikowano

Hmm, zauważyłem, gdzie jest problem - otóż program nie widzi końca pliku i nie może wyjść z pętli, pomoc znów potrzebna.

"The only person you should try to be better than is the person you were yesterday."

Opublikowano
while( !slowka.eof() ) - wykonuje pętlę, dopóki nie znajdzie końca pliku
{
getline( slowka, z ); - pobiera z "slowka" linię i zapisuje ją w "z"
slowka << x<<z << "\n"; - tutaj mnie możecie skopać, ponieważ nie wiedziałem, a z tego co teraz patrzę to chyba dodaje nową linię w tym tekście przy każdym powtórzeniu pętli ( cout<<, a cin>> - z tego wnioskuję, czyli kierunek strzałek)
x++; - zwiększa x o 1, co każdy obieg
}

Zmieniłem kod i po usunięciu "slowka << x<<z << "\n";" program zatrzymuje się i wisi.

"The only person you should try to be better than is the person you were yesterday."

Opublikowano
#include <fstream>
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int i=0,x=0,temp, y=0,los,los2;
char o;
string z,tlum;

int main()
{
    
    std::fstream slowka; 
    slowka.open( "slowka.txt", std::ios::in);
    if( slowka.good() == true )
    {
    slowka.seekg (0, slowka.beg);
    while(!slowka.eof())
    {
            getline( slowka, z );
            x++;
            cout << x <<"\n";
    }
	}
	else
	{
		cout << "Nie mozna odnalezc pliku";
	}	
	slowka.seekg (0, slowka.beg);
    string ang[x],pol[x];
    while (!slowka.eof())
    	{
        	for(int i=0;i<=x;i++)
            {
                slowka >> ang[i] >> pol[i];
            }
        slowka.close();
    	}
    for(int i=0;i<=x;i++)
    {
    	cout <<"\n"<<ang[i]<<" "<<pol[i];
	}	
	srand(time(NULL));
	cout <<"Wdus T, jesli chcesz wylosowac slowo, wdus N, jesli chcesz wyjsc";
	cin >> o;
	while (o='T' || 't')
	{
		los=rand()%x;
		los2=rand()%2;
		if (los2==1)
		{
			cout << "Podaj tlumaczenie podanego slowa: " << ang[los];
			cin >> tlum;
			if (tlum==pol[los])
				cout <<"Poprawnie przetlumaczone !";
		}
		else
		{
			cout << "Podaj tlumaczenie podanego slowa: " << pol[los];
			cin >> tlum;
			if (tlum==ang[los])
				cout <<"Poprawnie przetlumaczone !";
		}
	cout <<"Wdus T, jesli chcesz wylosowac slowo, wdus N, jesli chcesz wyjsc";
	cin >> o;
	}
getch();
}

Tak więc mam coś takiego :)

"The only person you should try to be better than is the person you were yesterday."

Opublikowano

MAsz prosty blad :D

 

for(int i=0;i<=x;i++) // TU ZMIEN NA i < X twoja tablica ma X elementow lecz liczac od zera ostatni jej eleent to x-1 wiec dajac i=x wychodzisz poza zakres tablicy
{
cout <<"\n"<<ang[i]<<" "<<pol[i];

 

 

///////////////////

 

Po 2 zmien to

while (!slowka.eof())
{
for(int i=0;i<=x;i++)
{
slowka >> ang[i] >> pol[i];
}
slowka.close();

 

 

na

int i = 0;

while (!slowka.eof())
{
slowka >> ang >> pol;
i++;
}

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...