Pawlllosss Temat założony przez niniejszego użytkownika |
Wczytywanie danych z pliku do dwóch różnych zmiennych. » 2014-08-01 12:53:24 Witajcie, miałem problem z nazwaniem tematu, chodzi oto, że próbuję rozwiązać zadanie maturalne, które polega na tym, że w trzech różnych plikach zapisane są zdania w takiej formie, że na początku jest podana ilość wyrazów w zdaniu, a w kolejnej linijce zdanie. Program ma polegać na tym, żeby zamienić każde wyrazy mające więcej niż 2 znaki w taki sposób, żeby pozostawała pierwsza i ostatnia litera, a zamiast liter między nimi wstawić znak -. Przykładowe zdanie: a kiedy wreszcie wyjedziemy na wakacje Przykładowe zdanie po przekształceniu: a k-y w-e w-y na w-e Poniżej mój kod: #include <iostream> #include <fstream> #include <string> #include <sstream>
using namespace std;
bool znaleziono( int i, string a ) { if( a[ i ] == ' ' ) return true; return false; }
string ucinanie( string tmp ) { int dl = tmp.length(); if( dl > 2 ) { tmp.erase( 1, dl - 2 ); tmp.insert( 1, "-" ); } return tmp; }
string modyfikacja( string a, int dl, int pomoc ) { string * tab; tab = new string[ pomoc ]; int j = 0; int tabcounter = 0; for( int i = 0; i < dl; i++ ) { if( tabcounter == pomoc - 1 ) { tab[ tabcounter ] = a.substr( j, dl - j ); break; } if( znaleziono( i, a ) ) { tab[ tabcounter ] = a.substr( j, i - j ); tabcounter++; j = i + 1; } } string c; for( int i = 0; i < pomoc; i++ ) c += ucinanie( tab[ i ] ) + " "; delete[] tab; return c; }
int main() { int pomoc, dl; string a, aodp; ifstream plik1; plik1.open( "dane1.txt" ); plik1 >> pomoc; while( getline( plik1, a ) ) { dl = a.length(); aodp = modyfikacja( a, dl, pomoc ); cout << aodp << endl; } cout << dl; return 0; }
O ile dobrze patrzę to cały algorytm jest dobry tylko problem polega na tym, że pierwszą linijkę program wczytuje dwukrotnie, najpierw do zmiennej pomoc(tak jak powinno być), a następnie do zmiennej string a(źle), na której wykonuje się modyfikacja i gdy program dochodzi wtedy do momentu zmieniana długości łańcucha to wysypuje się, bo dostaje łańcuchy o zerowej długości(chyba). Moje pytanie brzmi, czy da się ustawić getline tak, aby zaczął pobierać dane dopiero od drugiej linijki? |
|
michal11 |
» 2014-08-01 13:24:57 Po 1. tak plik1 >> pomoc; wczytujesz tylko pierwszy wyraz a nie całą linię. Po 2. po co to w ogóle robisz ? |
|
Pawlllosss Temat założony przez niniejszego użytkownika |
» 2014-08-01 13:29:56 Nie doprecyzowałem, przykładowy plik wygląda w następujący sposób:
14 dwie liczby naturalne ktorych jedynym wspolnym dzielnikiem jest jeden nazywa sie liczbami wzglednie pierwszymi
Ta zmienna pomoc jest od wczytania liczby 14, która określa ilość wyrazów w zdaniu, dzięki której wiem jak duża ma być tablica, która będzie przechowywać poszczególne wyrazy z zdania, które będą później modyfikowane. Nie wiem czy to optymalna metoda, ale powinna działać. |
|
michal11 |
» 2014-08-01 13:34:02 Czy twój plik składa się tylko z 1 cyfry i 1 zdania, czy to będzie się powtarzało ? |
|
Pawlllosss Temat założony przez niniejszego użytkownika |
» 2014-08-01 13:47:25 Tylko 1 cyfra i 1 zdanie, ale tak z ciekawości. Jakbym musiał napisać program gdyby się to powtarzało? |
|
michal11 |
» 2014-08-01 13:54:00 Jeżeli tylko 1 cyfra 1 zdanie to nie potrzebny jest while. Jeżeli by się powtarzało to wtedy wczytywanie cyfry też musisz dać do while i sprawdzać który wiersz się wczytuje. Coś w rodzaju bool cyfra = true; while( wczytaj linie ) { if( cyfra ) { wczytano cyfre cyfra = false; } else { wczytano zdanie cyfra = true; } }
|
|
Monika90 |
» 2014-08-01 13:57:54 tablica nie będzie potrzebna, można zamieniać wyrazy w locie, w uproszczeniu
#include <iostream> #include <sstream>
int main() { std::istringstream file(R"( 14 dwie liczby naturalne ktorych jedynym wspolnym dzielnikiem jest jeden nazywa sie liczbami wzglednie pierwszymi
6 a kiedy wreszcie wyjedziemy na wakacje )"); while (file) { int n; file >> n; std::string word; for (int i = 0; i < n; ++i) { file >> word; if (word.size() > 2) std::cout << word.front() << '-' << word.back() << ' '; else std::cout << word << ' '; } std::cout << '\n'; } }
|
|
michal11 |
» 2014-08-01 14:00:23 Tez mi się wydawało, że można to zrobić bez tablicy ale skoro ma gotowy kod to nie ingerowałem. |
|
« 1 » 2 |