Napisz program który wczyta plik tekstowy i zamieni wszystkie miejsca w których występują dwie spacje pod rząd, na pojedyńczą spacje.
Jaką metodą wczytać plik, tzn. najlepiej chyba znak, po znaku, ale jak to zrobić?
Napisz program który wczyta plik tekstowy i zamieni wszystkie miejsca w których występują dwie spacje pod rząd, na pojedyńczą spacje.
Jaką metodą wczytać plik, tzn. najlepiej chyba znak, po znaku, ale jak to zrobić?
fasadin napisał(a):
Chciałem wykorzystać tego typu funkcję, ale to chyba nie ten język:
void zamiana(string napis)
{
string temp = " ";
int x = napis.LastDelimiter(temp);
int y = temp.Length();
napis.Delete(x - y + 1, y + 1);
}
Znalazłem odpowiednik w języku C++, mógłby ktoś zobaczyć czy dobrze napisane:
string temp = " ";
size_t pos = napis.find(temp);
napis.erase(pos+1, 1);
Jak teraz wczytać plik, żebym mógł użyć tego?
rozsypalo Ci sie formatowanie i nic z tego nie zrozumialem
pokazalem CI metode w czystym C takze jest mozliwosc zrobienia tego w obu jezykach (W tagach jest C wiec zalozylem C)
edit. Nice ze mozesz korzystac z c++ a tego nie powiedziales
fstream i wczytujesz z pliku jak z cin
while (plik_wej >> jakasTamZmienna) { robisz_operacje; }
fasadin napisał(a):
while (cin >> jakasTamZmienna) { robisz_operacje; }
Hmm... to chyba będzie to można jakoś zastosować do mojego kodu. Bo mam problem właśnie ze znalezienie warunku do pętli while.
#include<iostream>
#include<algorithm>
#include<conio.h>
#include <fstream>
#include<string>
#include <stdio.h>
using namespace std;
size_t pos;
int main()
{
ifstream plik_wej;
ofstream plik_wyj;
string napis;
plik_wej.open("dane.txt", std::ios::in);
plik_wyj.open("out.txt", std::ios::out);
if (!plik_wej.good() || !plik_wyj.good())
{
cout << "Error! Nie udalo otworzyc sie pliku!" << std::endl;
return 0;
}
do {
getline(plik_wej, napis);
do{
string temp = " ";
pos = napis.find(temp);
napis.erase(pos + 1, 1);
} while (/* Jaki warunek ??? */);
cout << napis;
plik_wyj << napis << std::endl;
} while (!plik_wej.eof());
plik_wej.close();
plik_wyj.close();
_getch();
}
Ten warunek w pętli da się jakoś z tym cinem powiązać?
pomililo mi sie nie powinno byc tam cina tylko powinno byc
while (plik_wej >> TwojaZmienna)
{
operacje
}
ale to nie zadziala, zaraz zrobie edita do tego
vector<string> napisy;
while (!plik_wej.eof())
{
getline(plik_wej, napis);
napisy.push_back(napis);
}
zrob z tego funkcje (wczytywanie do vectora)
nastepna faza to usuwanie podwojnych spacji
uzywasz replace
http://www.cplusplus.com/reference/algorithm/replace/
(idziesz po wszystkich obiektach z vectora)
robisz z tego funkcje (usuwanieBialychZnakow)
pozniej wpisujesz do do wyjsciowego pliku
plik_wyj << napisy[i] // tutaj ma byc petla
plik_wyj << "\n"; // nie pamietam czy dodaje spacje getline czy nie
zlozonosc bedzie O(3n) (bo idziesz "3" razy po pliku), mozna to zrobic za pomoca O(n) (wszystko za pierwszym podejsciem) ale dzieki takiej metodzie lepiej zrozumiesz co masz robic. Pozniej mozesz to optymalizowac
fasadin napisał(a):
pomililo mi sie nie powinno byc tam cina tylko powinno byc
while (plik_wej >> TwojaZmienna)
{
operacje
}
zlozonosc bedzie O(3n) (bo idziesz "3" razy po pliku),
stworzyłem pętle do wyświetlania i zapisywania
for (int i = 0; i < napisy.size(); i++)
{
cout << napisy[i];
plik_wyj << napisy[i] << std::endl;
}
Mam pytanie czemu muszę akurat 3 razy iść po pliku?
Jak ma wyglądać ta metoda replace?
replace(napisy.begin(), napisy.end(),' ', ' ');
No odpisz ktoś w końcu jak ma wyglądać te replace, bo te powyżej nie działa....
Mój kod wygląda tak:
#include<iostream>
#include<conio.h>
#include<string>
#include <stdio.h>
#include<fstream>
using namespace std;
size_t pos =0;
int main()
{
ifstream plik_wej;
ofstream plik_wyj;
string napis, bufor;
plik_wej.open("dane.txt", std::ios::in);
plik_wyj.open("out.txt", std::ios::out);
if (!plik_wej.good() || !plik_wyj.good())
{
cout << "Error! Nie udalo otworzyc sie pliku!" << std::endl;
return 0;
}
while (!plik_wej.eof())
{
getline(plik_wej, napis);
bufor += napis;
}
while (pos != string::npos)
{
pos = 0;
string temp = " ";
pos = bufor.find(temp);
if (pos != string::npos)
{
bufor.erase(pos + 1, 1);
}
}
plik_wyj << bufor << std::endl;
cout <<napis<<"\n\n\n\n" << bufor;
plik_wej.close();
plik_wyj.close();
_getch();
}
I niby działa, jeśli ktoś z Was uświadomi mi czemu nie działa replace z vectorów i dlaczego pojawia się taki błąd,to spróbuję to zrobić vectorami - obecnie nie tracę czasu.
wstawienie kodu do posta
- @furious programming