Plikowe operacje wyjścia-wejścia

0

Dzień dobry! Pisząc kod napotkałem się na następujący problem. Funkcja wypiszZnaki2 wywołuje się dwukrotnie. Nie mogę zauważyć błędu. Proszę o pomoc!


#include <iostream>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <cstring>
using namespace std;

void wpisanie(char *pliczek, string T[][256],int &n)
{
	ofstream fout(pliczek);
	if (!fout) cout << "plik nie zostal otwarty" << endl;
	else
	{
		
		cout<<"Ilu studentow dane osobowe chcesz wpisac? Wprowadz n ";
		cin>>n;
		cout<<endl;
		cout<<"Podaj nastepujace informacje: "<<endl;
		cout<<"Po uzupelnieniu jednej osoby nacisnij dodatkowy eneter!"<<endl;
		cout<<endl;
		
		T[0][0]="NAZWISKO"; T[0][1]="IMIE"; T[0][2]="WIEK"; T[0][3]="MIEJSCE URODZENIA"; T[0][4]="TELEFON";
		for (int i=0;i<1;i++)
		{
			for (int  j=0;j<5;j++) cout<<T[i][j]<<"\t";
		}
		cout<<endl;
		
		for (int i=0;i<n;i++)
		{
			for (int j=0;j<6;j++) getline(cin,T[i][j]);
	
		}
		
		
	for (int i=0;i<n;i++)
		{
			
			for (int j=0;j<6;j++) fout<<T[i][j]<<"\t";
			fout<<endl;	
		}
	 
		fout.close();
		cout << endl;
	}
}

void wypiszZnaki (char *pliczek)
{
 char znak;
 ifstream fin(pliczek);
 if (!fin) cout<<"plik nie zostal otwarty"<<endl;
 else
 {
  cout<<"\nDane zawarte w pliku:"<<endl;
//    while (!fin.eof())
//    {
//      fin.get(znak);                  //fin>>znak;
//      cout<<znak;
//    }
  while (fin.get(znak)) cout<<znak;
  cout<<endl;
  fin.close();
 }
 fflush(stdin);
}


void wypiszZnaki2(char *nazwapliku, string T[][256], int n)
{
string liczba;
	ifstream fin(nazwapliku);
	if (!fin) cout << "plik nie zostal otwarty" << endl;
	else
	{
		while (!fin.eof())
		{
			fin >> liczba;
			
				for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < 6; j++)
		{
			if ((T[i][j]==T[i][1])|| (T[i][j]==T[i][5]))
			{
				cout << T[i][j] << "\t";
			}
			
		}
		cout << endl;
	}
	cout << endl;
cout<<endl;
		fin.close();
		cout << endl;
	}
	fflush(stdin);
}
}




int main(void)
{
	string T[256][256];
	int n;
	char *plik1 = "plik1.txt", *plik2 = "plik2.txt";
	wpisanie(plik1,T,n);
	cout<<endl;
	wypiszZnaki(plik1);
	cout<<endl;
	wypiszZnaki2(plik1,T,n);
	system("pause");
	return 0;
}

 
0

Poza tym, że nie rozumiem po co:

 fflush(stdin);

To po czym poznajesz, ze funkcja wypiszZnaki wykonuje się 2 razy?
Pewnie w wypiszZnaki2 miał być plik2, ale jest plik1?

0

Mam utworzyć tylko jeden plik.txt więc wszystko jest w porządku. Wykonuje się dwa razy po włączeniu programu; po prostu wypisuje dwa razy te same informacje bezposrednio po sobie.

0

Jeśli to jest c++ to tak na dzień dobry:

char *plik1 = "plik1.txt", *plik2 = "plik2.txt";

To nie powinno się skompilować, bo string literal to nie jest char* i nie można castować z consta do l-value.
A więc powinno być:

const char* plik1 = "plik1.txt"; const char* plik2 = "plik2.txt"

A najlepiej to po prostu:

char plik1[] = "plik1.txt"; char plik2[] = "plik2.txt";

Poza tym.. dlaczego nie możesz ładnie formatować kodu? A jeśli sam nie potrafisz to chociaż przed wstawką na forum skorzystaj z:
http://format.krzaq.cc/

Trochę bardziej czytelny kod wyjdzie:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <cstring>
using namespace std;

void wpisanie(char* pliczek, string T[][256], int& n)
{
    ofstream fout(pliczek);
    if (!fout)
        cout << "plik nie zostal otwarty" << endl;
    else {
        cout << "Ilu studentow dane osobowe chcesz wpisac? Wprowadz n ";
        cin >> n;
        cout << endl;
        cout << "Podaj nastepujace informacje: " << endl;
        cout << "Po uzupelnieniu jednej osoby nacisnij dodatkowy eneter!" << endl;
        cout << endl;

        T[0][0] = "NAZWISKO";
        T[0][1] = "IMIE";
        T[0][2] = "WIEK";
        T[0][3] = "MIEJSCE URODZENIA";
        T[0][4] = "TELEFON";
        for (int i = 0; i < 1; i++) {
            for (int j = 0; j < 5; j++)
                cout << T[i][j] << "\t";
        }
        cout << endl;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 6; j++)
                getline(cin, T[i][j]);
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 6; j++)
                fout << T[i][j] << "\t";
            fout << endl;
        }

        fout.close();
        cout << endl;
    }
}

void wypiszZnaki(char* pliczek)
{
    char znak;
    ifstream fin(pliczek);
    if (!fin)
        cout << "plik nie zostal otwarty" << endl;
    else {
        cout << "\nDane zawarte w pliku:" << endl;
        //    while (!fin.eof())
        //    {
        //      fin.get(znak);                  //fin>>znak;
        //      cout<<znak;
        //    }
        while (fin.get(znak))
            cout << znak;
        cout << endl;
        fin.close();
    }
    fflush(stdin);
}

void wypiszZnaki2(char* nazwapliku, string T[][256], int n)
{
    string liczba;
    ifstream fin(nazwapliku);
    if (!fin)
        cout << "plik nie zostal otwarty" << endl;
    else {
        while (!fin.eof()) {
            fin >> liczba;

            for (int i = 0; i < n; i++) {
                for (int j = 0; j < 6; j++) {
                    if ((T[i][j] == T[i][1]) || (T[i][j] == T[i][5])) {
                        cout << T[i][j] << "\t";
                    }
                }
                cout << endl;
            }
            cout << endl;
            cout << endl;
            fin.close();
            cout << endl;
        }
        fflush(stdin);
    }
}

int main(void)
{
    string T[256][256];
    int n;
    char* plik1 = "plik1.txt", *plik2 = "plik2.txt";
    wpisanie(plik1, T, n);
    cout << endl;
    wypiszZnaki(plik1);
    cout << endl;
    wypiszZnaki2(plik1, T, n);
    system("pause");
    return 0;
}

Dla mnie osobiście kod nadaje się tylko do.. sam sobie dopowiedz.

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