sortowanie i zliczanie

0

Witam!
Po raz kolejny zwrazam sie do Was z prosba o pomoc, bo w sumie po to tu jestescie. Moj problem wyglada nastepujaco:

  1. Gdy zliczam ilosc wyrazow, to wyskakuje mi za kazdym razem 0;
  2. Gdy chce posortowac elementy, to pozostaje puste miejsce.
    Kod:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cstring>
#include <iomanip>      
#include <algorithm>  
#include <map>  
#include <vector>  


using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(void)
{
	
	string fileName;
	int c;
	int array_size = 1024;
	char *array = new char[array_size];
	int poss = 0,
		itype = 1,
		count = 0;
	
	// open the file
	cout << "Podaj nazwe pliku, bez rozszerzenia.\n"
			"Rozszerzenie z jakiego korzysta program to *.txt " << endl;
	cout << "Nazwa pliku: ";
	cin >> fileName;
	fileName = fileName + ".txt";
	ifstream inFile;
	inFile.open(fileName.c_str());
	vector<string> names;
	if (inFile.is_open()){
		while (!inFile.eof() && poss < array_size){
			//reading one character from file to array
			inFile.get(array[poss]);	
			++poss;
		}
		//placing character array terminating character
		array[poss-1] = '\0';
		system("cls");
		cout << "Plik zostal otwarty prawidlowo, co dalej chcesz z nim zrobic?\n";
		while(itype != 0){
			cout << "[1] Pokaz zawartosc pliku\n";
			cout << "[2] Ile znakow jest w pliku?\n";
			cout << "[3] Ile jest wyrazow w pliku?\n";
			cout << "[4] Posortuj wyrazy alfabetycznie (z powtorzeniami)\n";
			cout << "[0] Wyjdz\n";
			cin >> itype;
			switch(itype){
				// show text
				case 1:{
					system("cls");
					for (int i = 0; array[i] != '\0'; ++i){
						cout << array[i];
					}
					cout << endl << endl << endl << endl;
					break;
				}
				// count of characters
				case 2:{
					system("cls");
					cout << string(array).length();
					cout << endl << endl << endl << endl;
					break;
				}
				// count of words
				case 3:{
					system("cls");
					for (int i = 0; array[i] != '\0'; ++i){
						++count;
					}				
					cout << "Ilosc wyrazow w pliku: " << count << endl;			
					cout << endl << endl << endl << endl;
					break;
				}
				// sort
				case 4:{
					system("cls");
					string word;
					while (inFile.good()) {
    				getline(inFile, word);
    				names.push_back(word);
					}

					sort(names.begin(), names.end());

					// Loop to print names
					for (size_t i=0; i < names.size(); i++)
					cout << names[i] << "\n";
					
					break;
				}
				// count of how many times word shows
				default:{
					system("cls");
					break;
				}
			}
		}; //while
		system("cls");
		cout << "Dziekujemy za skorzystanie z programu. Zapraszamy ponownie.\n";
	} // end of if - file is open
	// if can't open the file
	else{
		system("cls");
		cout << "Nie mozna otworzyc pliku. Sprawdz nazwe i wroc ponownie.\n";
	}
	
	
	
	
	inFile.close();	
	return 0;
}

Jezeli mam cos poprawic w kodzie i mogloby to usprawnic dzialanie to prosze o jakies dokladniejsze wskazowki, poniewaz jest to na zaliczenie i mam czas tylko do czwartku. Dziekuje ;)

2

SOA #1: u mnie "działa".

Sprawdź czy podajesz poprawną nazwę pliku, lub czy nie zaczyna się on od znaku \0.

Kilka zastrzeżeń:

  1. char *array = new char[array_size]; nagie new to zły nawyk, a tutaj jest zwyczajnie zbędne. Lepiej użyć std::vector<>. W tym przypadku std::vector<std::string> dla przetrzymywania wyrazów.
        while (!inFile.eof() && poss < array_size){
            //reading one character from file to array
            inFile.get(array[poss]);    
            ++poss;
        }

Wczytujesz max 1023 znaki, nijak się to ma do wyrazów.
3. W punkcie 3. podajesz ilość wczytanych znaków przed znakiem \0 lub 1023, wybierając mniejszą wartość. Żadnego związku z wyrazami.
4. W punkcie 4. wczytujesz linie (ale z pominięciem pierwszych 1023 już wczytanych znaków pliku) i to je sortujesz.

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