Zamiana dwóch spacji na jedną podczas wczytywania pliku.

0

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ć?

0
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?

0

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; }

0
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ć?

0

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

0
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....

@Edit

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1