#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
bool bfun_OpenFile(string &sName, ifstream &fsFil);
void vfun_SaveToFile1(const string sName, int iValue);
void vfun_CheckNumberEdges(ifstream &fsFile, const int &iEdgeNumber);
int ifun_CheckNumberVertices(ifstream &fsFile, int iEdgeNumber);
void vfun_MakeIncidentList(vector<Lista> &vIncidentList, ifstream &fsFile, const int &iEdgeNumber, string sName);
void vfun_SaveToFile2(vector<Lista> &vIncidentList, const int &iVerticesNumber);
int main() {
string sName;
ifstream fsFile;
int iEdgeNumber, iVerticesNumber;
do {
cin >> sName;
} while (!bfun_OpenFile(sName, fsFile));
fsFile >> iEdgeNumber;
vfun_CheckNumberEdges(fsFile, iEdgeNumber);
iVerticesNumber = ifun_CheckNumberVertices(fsFile, iEdgeNumber);
vector<Lista> incidentList(iVerticesNumber);
vfun_MakeIncidentList(incidentList, fsFile, iEdgeNumber, sName);
vfun_SaveToFile2(incidentList, iVerticesNumber);
fsFile.close();
return 0;
}
/**
* Szukanie pliku, sprawdzanie czy jest z rozszerzeniem .txt, dopisywaie .txt
* @param sName oryginalna nazwa pliku tekstowego
* @param fsFile nazwa którą nadaliśmy plikowi
* @return true gdy znaleziono plik
* @return false gdy nie znaleziono pliku
*/
bool bfun_OpenFile(string &sName, ifstream &fsFile) {
try {
if (sName.find(".txt") != string::npos) {
fsFile.open(sName.c_str());
}
else {
sName += ".txt";
fsFile.open(sName.c_str());
}
if (!fsFile) {
throw "!";
}
}
catch (char *cError) {
fsFile.clear();
cout << cError;
return false;
}
return true;
}
/**
* Funkcja zapisująca do pliku
* @param sName nazwa pliku
* @param iValue wartość
*/
void vfun_SaveToFile1(const string sName, int iValue) {
ofstream outFile;
outFile.open(sName, ios::app);
outFile << iValue << ", ";
outFile.close();
}
/**
* Funkcja sprawdzająca czy liczba krawędzi jest poprawna
* @param fsFile plik z danymi
* @param iEdgeNumber ilość krawędzi
*/
void vfun_CheckNumberEdges(ifstream &fsFile, const int &iEdgeNumber) {
if (iEdgeNumber < 0) {
cout << "!";
exit(EXIT_FAILURE);
}
}
/**
* Sprawdzanie liczy wierzchołków
* @param fsFile plik z danymi
* @param iEdgeNumber liczba krawędzi
* @return iMax liczba wierzchołków
*/
int ifun_CheckNumberVertices(ifstream &fsFile, int iEdgeNumber) {
int iTemporary;
int iMax = 0;
while (fsFile.eof() == false) {
fsFile >> iTemporary;
if (iTemporary > iMax) {
iMax = iTemporary;
}
}
return iMax;
}
void vfun_MakeIncidentList(vector<Lista> &vIncidentList, ifstream &fsFile, const int &iEdgeNumber, string sName) {
int iFirst = 0, iSecond = 0, iTemporary = 0;
fsFile.close();
bfun_OpenFile(sName, fsFile);
fsFile >> iTemporary;
for (int i = 0; i < iEdgeNumber; i++)
{
fsFile >> iFirst;
fsFile >> iSecond;
vIncidentList[iFirst - 1].AddElement(iSecond);
vIncidentList[iSecond - 1].AddElement(iFirst);
}
}
void vfun_SaveToFile2(vector<Lista> &vIncidentList, const int &iVerticesNumber) {
ofstream outFile;
outFile.open("Wyniki.txt", ios::app);
for (int i = 0; i < iVerticesNumber; i++) {
vfun_SaveToFile1("Wyniki.txt", i + 1);
outFile << vIncidentList[i];
}
for (int i = 0; i < iVerticesNumber; i++) {
vfun_SaveToFile1("Wyniki.txt", i + 1);
outFile << vIncidentList[i].Size();
outFile << endl;
}
outFile.close();
}