Odczytywanie znaków z pliku

0

Witam.
Mam problem z prostym programem mającym za zadanie sczytać wszystkie znaki z pliku .txt, a następnie wyświetlić ilość znaków podanych przez użytkownika.
Przed rozpoczęciem pisania metody LiczZnaki odpaliłem program i zauważyłem, że "wywala" się on za każdym dojściem do funkcji system("PAUSE"), umieszczonej za pętlą while(PlikWejsciowy.good()), (którą na wszelki wypadek zaznaczyłem w kodzie) gdziekolwiek ową funkcję system("PAUSE"), umieszczę... Czy możliwe jest, by program/system/aplikacja/program nie rozumiał, bądź kłócił się z tą funkcją, czy też to ja tak namieszałem? Co mogłem zrobić źle, w pętli pobierania znaków z pliku do tablicy, jeśli działa ona poprawnie (na dowód umieściłem niżej pętlę wyswietlającą znaki z tablicy *TablicaZnakow_Plik), a jedynie "nie pozwala" na użycie po niej funkcji system()?
Niżej zamieszczam mój kod programu, na wszelki wypadek, gdyby okazało się to jednak moją winą.

//Biblioteki.h:

#ifndef BIBLIOTEKI_H
#define BIBLIOTEKI_H
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>

#include <string.h>


#endif
//Plik.h:

#pragma once
#include "Biblioteki.h"

class Plik
{
private:
	std::fstream PlikWejsciowy;
	int LiczbaZnakow;
	int Argument;
	char *BuforZnakowy;
	char *TablicaZnakow_Plik;
public:
	Plik(void);
	~Plik(void);
	void OtworzPlik(char *NazwaPliku);
	int LiczZnaki(char *Lancuch);

};


//Plik.cpp:

#include "Plik.h"
#include "Biblioteki.h"

void Plik::OtworzPlik(char *NazwaPliku )
{
	using namespace std;
	strcat(NazwaPliku, ".txt");
	cout<<NazwaPliku;	
	LiczbaZnakow = 0;
	system("pause");
	TablicaZnakow_Plik = (char*)malloc(sizeof(char));
	PlikWejsciowy.open(NazwaPliku, ios_base::in);
	if(!PlikWejsciowy.is_open())
		cout<<"Nie znaleziono pliku! \nUpewnij się, że podana nazwa jest prawidłowa!"<<endl;
	else
	{
		cout<<"Otwarto plik o nazwie: "<<NazwaPliku<<"\n Rozpoczęto liczenie..."<<endl;
		while(PlikWejsciowy.good())
		{
	
		TablicaZnakow_Plik[LiczbaZnakow] = PlikWejsciowy.get();
		LiczbaZnakow++;
		cout<<"Pobrano znak z pliku!\n";

		}
	for(int i=0; i<LiczbaZnakow; i++)
		cout<<TablicaZnakow_Plik[i];
	}
}

Plik::Plik(void)
{
}

Plik::~Plik(void)
{
	std::cout<<"Zamykanie pliku!"<<std::endl;
}

/*int Plik::LiczZnaki(char *Lancuch)
{

}*/

//PlikWykonawczy.cpp:
#include "Biblioteki.h"
#include "Plik.h"

using namespace std;

int main()
{
	char *NazwaPliku;
	Plik Plik;
	NazwaPliku = (char*)malloc(sizeof(char));
	char *Fraza;
	Fraza = (char*)malloc(sizeof(char));
	int LiczbaZnakow=0;
	cout<<"Podaj nazwę pliku: ";
	cin>>NazwaPliku;
	cout<<"\n Wpisz szukaną i zliczaną frazę: ";
	cin>>Fraza;
	cout<<"\n";

	Plik.OtworzPlik(NazwaPliku);

	system("PAUSE");
	return 0;
}

 

Pragnę zaznaczyć, że z samym C++ jestem początkującym, więc z tego tytułu proszę o wyrozumiałość :P

3
  1. Jaki jest sens umieszczenia system("pause") w OtworzPlik?
  2. Dlaczego nie korzystasz z std::string, tylko ohydnych char*?
  3. Jeśli C++, to #include <cstdlib>, #include <cstdio>, #include <cstring>

BTW przez niekorzystanie z std::string masz buga:

NazwaPliku = (char*)malloc(sizeof(char));

allokujesz przez malloc (za to już powinieneś trafić do piekła) tyle miejsca, by starczyło na 1 znak, a potem wczytujesz tam cały ciąg znaków.

0

system("PAUSE") w metodzie OtworzPlik miał służyć jedynie sprawdzeniu jaka jest zależność, między położeniem funkcji system(), a pracą programu (czyli kiedy się wywali) stąd tyle tego w, rzeczywiście, głupich miejscach.
char, string.h itp to niestety przyzwyczajenie z C, jak mówiłem - C++ to dla mnie coś nowego. Ale muszę zapytać, jaka jest różnica między <string> a <cstring>?
A co do tematu, to naprawienie alokacji rozwiązało problem.
Dzięki wielkie twonek :D

0

<cstring> to C++ -owy odpowiednik <string.h>. Praktycznie to samo.
<string> to nagłówek definiujący m.in. klasę std::string

W C++ się korzysta z new i delete zamiast malloc i free (swoją drogą miałeś wyciek pamięci, bo nie miałeś free). Ale najlepiej w ogóle nie korzystać z ręcznej alokacji pamięci, tylko wykorzystać takie klasy jak std::string, dzięki czemu unika się takich głupich błędów.

0

Dzięki wielkie za pomoc :)

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