Permalänk
Medlem

c++ inläsning utläsning.

Hej!

jag håller på att läsa in en bok (liftarens guide i galaxen)
jag har förljande kod:

#include <iostream> #include <string> #include <map> #include <algorithm> #include <fstream> using namespace std; int value(char &sant) { if(isalpha(sant)) { return 0; } else { return 1; } } int main() { const char*filename0="lgtg"; const char*filename1="test"; map<string, int> hash; map<int, string> sort; map<string, int>::iterator it0; map<int, string>::reverse_iterator it1; string word; int i; ifstream in(filename0); if(!in) { cout << "kunde inte öppna filen: " << filename0 << endl; } else { while(!in.eof()) { in>>word; word.erase(remove_if(word.begin(), word.end(), value), word.end()); transform(word.begin(), word.end(), word.begin(), ::tolower); hash[word]++; hash.erase(""); } in.close(); ofstream out(filename1); for(it0 = hash.begin(); it0!=hash.end(); it0++) { word=(*it0).first; i=(*it0).second; sort[i]=word; } i=0; for(it1 = sort.rbegin(); it1 != sort.rend(); it1++) { if(i<10) { out << (*it1).second << " " << (*it1).first << endl; } i++; } out.close(); } }

jag får följande svar i min fil:

the 2537 of 1258 a 1199 to 1185 and 1184 it 798 he 788 said 681 in 630 was 607

men ska få denna utskrift i filen, "enligt facit":

2538 the 1259 of 1199 a 1187 to 1184 and 892 it 808 he 681 said 632 you 630 in

antar att problemet är pga att de är typ sånna ord som it's, you'r osv...
hur kan man få bort detta utan 2000 miljoner if satser?

Tack för svar!!

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

Tror inte det finns nåt färdigt standard för detta, vad jag vet iaf. (Finns säkert nån tredjepart man kan tanka ner)
Testa skriva ut alla som har ' se hur många olika kombinationer det är, kan ju inte vara alltförmånga.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

100+ it's
så de finns en del.
det är nämligen helaboken på 45000+ ord

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem
Skrivet av Mejan:

100+ it's
så de finns en del.
det är nämligen helaboken på 45000+ ord

Ja men 100+ it's är ju en ifsats i kod.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Går det att lösa med strtok() på ' och bara ta första delen?
http://www.cplusplus.com/faq/sequences/strings/split/#strtok

Permalänk
Medlem
Skrivet av Nallepigan:

Går det att lösa med strtok() på ' och bara ta första delen?
http://www.cplusplus.com/faq/sequences/strings/split/#strtok

Eller word.substr(0, word.find_first_of('\'')) istället för att krångla med gamla C-funktioner.

Permalänk
Medlem

Skrev ihop lite kod utifrån din kod, du kan ju testa och se om det blir bättre resultat.
Såg även att din sort inte var riktigt 100.

http://codepad.org/DsiKW9wB

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

NoPaiN, de var en bra lössning! tack så mycket

men min lössning slutade så här:

#include <iostream> #include <string> #include <map> #include <algorithm> #include <fstream> using namespace std; typedef pair<string, int> pair_t; typedef map<string, int> map_t; typedef map<string, int>::iterator it_t; bool comp(pair_t a, pair_t b) { return a.second<b.second; } int value(char &sant) { if(isalpha(sant)) { return 0; } else { return 1; } } int main() { const char*filename0="lgtg"; const char*filename1="done"; map_t hash; it_t it0; it_t it1; string word; int i, top; cout << "skriv in hur många av de mest återkommande ord du vill ska vissas(heltals värde): "; cin >> top; ifstream in(filename0); if(!in) { cout << "kunde inte öppna filen: " << filename0 << endl; } else { while(!in.eof()) { in>>word; for(int j=0; j<word.size(); j++) { if(!isalpha(word.at(j))) { for(int y=word.size()-1; y>j; y--) { in.putback(word.at(y)); word.erase(y,1); } } } word.erase(remove_if(word.begin(), word.end(), value), word.end()); transform(word.begin(), word.end(), word.begin(), ::tolower); hash[word]++; hash.erase(""); } in.close(); ofstream out(filename1); i=0; for(it0 = hash.begin(); it0!=hash.end(); it0++) { if(i<top) { it1 = max_element(hash.begin(), hash.end(), comp); out << (*it1).first << " " << (*it1).second << endl; hash.erase(it1); } i++; } out.close(); cout << "Svaret hittar du i den ny skapta filen " << filename1 << " som ligger i denna map!" << endl; } }

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

Hej,

Bara snabbskummat igenom din kod men tror mycket ligger i hur din "value" metod fungerar (vilket i sig är ett väldigt otydligt namn men låt gå).

Borde det inte vara så att du ska fundera lite på vilka tecken som är giltiga i ett "ord" enligt din definition. Om det nu är så att ' ska ingå i ord så borde det vara ganska enkelt att modifera en viss metod för att få ihop en lösning.

//C

Permalänk
Medlem

jag ska nog berätta att de jag hade som "facit" som läraren gav oss var ett terminal script, som gjorde en rad brytning varje gång de va ett tecken som inte var en bokstav i form a-z. och sedan tog den bort alla som inte var a-z... och det var även så att han ville att vårt program skulle få exakt samma, med lite tips och knep så fick jag till det med den sista koden jag la up. men tack all för er hjälp!

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6