Použití returnutého stringu v porovnání – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Použití returnutého stringu v porovnání – C / C++ – Fórum – Programujte.comPoužití returnutého stringu v porovnání – C / C++ – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1600 příspěvků
10. 4. 2015   #1
-
0
-

Zdravím, předem říkám, že nejsem žádný programátor a tak mam s tímhle asi nejspíš triviálním případem trochu problém. Jde mi o to, že mam CSV soubor ve kterém postupně načítám hodnoty po čárku a tyto hodnoty chci porovnat se zadanou hodnotou. Tuto hodnotu chci ale získat pomocí funkce která, když ji zavolám, tak mi do console vypise zadost uzivateli o zadani stringu, tento string pote ulozim do proměnné a tuto proměnnou poté použiju jako návratovou hodnotu z této funkce.

Nevím ale jak to syntakticky napsat, nebo jestli to vubec nejak jde. Jedná se konkrétně hlavně o porovnání if (value == vyhledavani())        

Předem díky za pomoc.         
         

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <list>
#include <algorithm>
#include <iterator>
#include <cctype>
 

using namespace std;

string vyhledavani(string lower, string upper)              

    {
    cout << "Zadejte nazev mistnosti: ";
    cin >> lower;
    transform(lower.begin(),lower.end(), std::back_inserter(upper), ::toupper);
    return upper;
    }

int main()
{

int kontrola=0;

/*
    cout << "Zadejte nazev mistnosti: ";
    string lower;
    cin >> lower;
    string upper;
    transform(lower.begin(),lower.end(), std::back_inserter(upper), ::toupper);
*/
    ifstream file ("file2.csv");                            
    string value;
    list <string> values;
    while (file.good())
    {
        getline (file, value, ',');                         
          if (value == vyhledavani())                         //porovnani nasteneho stringu se zadanym nazvem mistnosti
            {
            string mistnost = value;
            getline (file, value, ',');
            string typ = value;
            getline (file, value, ',');
            string budova = value;
            cout << "\n" << typ << " " << mistnost << " se nachazi v budove " << budova << "." <<endl;    //vypis nazvu mistnosti spolu j jejim typem a umistenim
            int kontrola=1;
            return 0;
            }
      }
      if (kontrola != 1)                            //pokud uzivatel zada mistnost, ktera neni v databazi
      {
      cout << "\nTato mistnost nebyla nalezena!" << endl;
      }
}

Nahlásit jako SPAM
IP: 89.103.215.–
ingiraxo+15
Grafoman
11. 4. 2015   #2
-
0
-

nevímě jak vypadá ten csv soubor, ale pokud co řádek, to informace o budově, tak to máš špatně celý

aktuálně za jednu iteraci přečteš 3 řádky v csv (možná to je chtěný, ale většinou co řádek csv, to všechny informace o objektu) a následně tam každou iteraci načítáš novou hodnotu pro porovnání (nejspíš pro vyhledání)

teď si vem, že přešteš 10.řádků a na 11. zadáš hodnotu "xxx", který existuje na 5.řádku a ses v háji :)

Pokud ti jde o vyhledání a následně získání všech informací o objektu (z řádku), tak by si měl v první řadě načíst z konzole to, co chceš vyhledat jako první (před čtením souboru) a při čtení to vyhledat (ta tvoje metoda bude vracet bool, né string)

rozhodně není dobrý porovnávat 2 stringy v IF, tím způsobem, jakým si to napsal

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
PiranhaGreg0
Stálý člen
11. 4. 2015   #3
-
0
-

Hodně zhruba by to šlo třeba takto. Ale to parsování csv je potřeba přepsat a porovnávání by si taky zasloužilo lepší funkci...  

#include <iostream>
#include <fstream>
#include <map>
#include <cstdlib>

using namespace std;

struct Lokace {
	string Mistnost;
	string Typ;
	string Budova;
};

map<string, Lokace> getCSV(const char * path) {
	map<string, Lokace> csv;
	ifstream file(path);

	if (!file) {
		cerr << "soubor " << path << " nelze otevrit" << endl;
		exit(2);
	}

	while(file) {
		Lokace lokace;

		getline(file, lokace.Mistnost, ',');
		getline(file, lokace.Typ, ',');
		getline(file, lokace.Budova);

		if (file)
			csv[lokace.Mistnost] = lokace;	
	}

	return csv;
}

int main(int argc, char const * argv[]) {
	if (argc != 2) {
		cerr << "pouziti: " << argv[0] << " <csv soubor>" << endl;
		return 1;
	}

	map<string, Lokace> csv = getCSV(argv[1]);
	string input;

	cout << "Zadejte nazev mistnosti: ";
	cin >> input;

	if (csv.find(input) != csv.end())
		cout << csv[input].Typ << ' ' << csv[input].Mistnost << " se nachazi v budove " << csv[input].Budova << '.' << endl;
	else
		cout << "Tato mistnost nebyla nalezena!" << endl;

	return 0;
}
$ g++ -Wall -pedantic csv.cpp -o mistnosti
$ ./mistnosti test.csv
Zadejte nazev mistnosti: 52
Poslucharna 52 se nachazi v budove T2-C4.
$ █

test.csv

350,Ucebna,T9
52,Poslucharna,T2-C4
1312,Ucebna,T9-A
Nahlásit jako SPAM
IP: 109.81.210.–
Martin
~ Anonymní uživatel
1600 příspěvků
11. 4. 2015   #4
-
0
-

 Diky moc za radu, udelal jsem to nakonec takhle, mozna je to trochu prasarna dole s tou main funkci, ale funguje to tak jak ma. Nevim jestli tam jsou osetreny vsechny pripady :-)

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <list>
#include <algorithm>
#include <iterator>
#include <cctype>


using namespace std;

void uvod(void)
{
    cout << "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n";
    cout << "|||||||||||||                                             |||||||||||||\n";
    cout << "|||||||||||||   Program pro lokalizaci mistnosti   |||||||||||||\n";
    cout << "|||||||||||||                                             |||||||||||||\n";
    cout << "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n";
}

struct Lokace//...................................................................................................................vytvoreni struktury pro udaje o mistnostech
    {
	string Mistnost;
	string Typ;
	string Budova;
    };

string hledani(void)//............................................................................................................funkce pro nacteni nazvu mistnosti od uzivatele
{
    cout << "\nZadejte nazev hledane mistnosti: ";
    string vstup;
    getline(cin, vstup);
    return vstup;
}

string uppercase(string vstup)//..................................................................................................funkce pro prevedeni celeho stringu do uppercase
    {
    string vystup;
    transform(vstup.begin(),vstup.end(), std::back_inserter(vystup),::toupper);
    return vystup;
    }

string mezery(string vstup)//.....................................................................................................funkce pro odstraneni mezery ze stringu
    {
    string vystup = vstup;
    for(int i=0; i<vystup.length(); i++)
    if(vystup[i] == ' ') vystup.erase(i,1);
    return vystup;
    }

string noveHledani(void)//........................................................................................................funkce pro vyhledani nove mistnosti
    {
    cout << "\nChcete zadat novou mistnost? (Ano/Ne): ";
    string vstup;
    getline(cin, vstup);
    vstup = mezery(vstup);
    vstup = uppercase(vstup);
    if (vstup == "ANO")
        {
        return "Ano";
        }
    if (vstup == "NE")
        {
        exit(0);
        }
    else
        {
        cout << "Chyba v zadavani!\n";
        noveHledani();
        }
    }

void hlavni(void)
    {

    string vstup = hledani();
    vstup = mezery(vstup);
    vstup = uppercase(vstup);
    string vysledek = vstup;
    //cout << "\nProbehlo zadani uzivatelem: " << vysledek << endl;//.............................................................kontrolni vystup hodnoty zadane uzivatelem
    //string vysledek2 = mezery(vysledek);//......................................................................................volani funkce pro odstraneni mezery
    //cout << "\nProbehlo odstraneni mezer: " << vysledek2 << endl;//.............................................................kontrolni vystup zadane hodnoty bez mezer
    //string vysledek3 = uppercase(vysledek2);//..................................................................................volani funkce pro prevod stringu na velka pismena
    //cout << "\nProbehlo prevedeni do uppercase: " << vysledek3 << endl;//.......................................................kontrolni vystup zadane hodnoty bez mezer a v uppercase
    //cout << vysledek3 << endl;//................................................................................................kontrolni vystup pro porovnani
    ifstream file ("file.csv");//.................................................................................................nacteni zdrojoveho souboru s daty o mistnostech
    while (file.good())
        {
        Lokace lokace;
        getline(file, lokace.Mistnost, ',');//....................................................................................nacteni nazvu mostnosti
		getline(file, lokace.Typ, ',');//.........................................................................................nacteni nazvu typu mistnosti
		getline(file, lokace.Budova);//...........................................................................................nacteni nazvu budovy
          if (lokace.Mistnost == vstup)//.........................................................................................porovnani nacteneho stringu se zadanym nazvem mistnosti
            {
            cout << "\n" << lokace.Typ << " " << lokace.Mistnost << " se nachazi v budove " << lokace.Budova << "." << endl;//....vypis nazvu mistnosti spolu s jejim typem a umistenim
            if (noveHledani() == "Ano");
                {
                hlavni();
                }
            }
            }
    cout << "\nMistnost \"" << vstup << "\" nebyla nalezena!\n";
    if (noveHledani() == "Ano");
        {
        hlavni();
        }
    }

int main()
{
    uvod();
    hlavni();
}
Nahlásit jako SPAM
IP: 89.103.215.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

Porovnani dvou stringu — založil insider

Porovnání 2 char — založil Mike.JT

Porovnani retezcu? — založil TuTi_fruTi

Porovnani poli — založil LJ

Porovnání double — založil vazbok

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý