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

2015-01-20 12:07
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ć?

Pozostało 580 znaków

2015-01-20 12:43
2015-01-20 12:48
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?

edytowany 2x, ostatnio: SPOJowiecaa, 2015-01-20 12:49

Pozostało 580 znaków

2015-01-20 12:49
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; }

edytowany 2x, ostatnio: fasadin, 2015-01-20 13:16

Pozostało 580 znaków

2015-01-20 13:00
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ć?

Pozostało 580 znaków

2015-01-20 13:06
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

edytowany 2x, ostatnio: fasadin, 2015-01-20 13:14
Pokaż pozostałe 2 komentarze
nie po prostu nie wiem jak działają, jaka metoda lub funkcja zwraca długość wektora? - SPOJowiecaa 2015-01-20 18:59
a moją metodą się nie da tego zrobić? - SPOJowiecaa 2015-01-20 19:00
sprawdz w dokumentacji. Mozesz tez kopac grob widelcem ale czy naprawde bedziesz to robic? - fasadin 2015-01-20 19:01
szczerze mówiąc, to nie wiem czy sprawdziłeś mój kod, ale on działa tylko, że wczytuje tylko jedną linijkę do pliku.... tak tłumacząc mi niczego się nie nauczę.. - SPOJowiecaa 2015-01-20 19:02
Jak ma wyglądać ta funkcja replace: replace(napisy.begin(), napisy.end(), ' ', ' '); Bo tak mi nie działa? - SPOJowiecaa 2015-01-20 19:13

Pozostało 580 znaków

2015-01-20 19:05
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

edytowany 6x, ostatnio: furious programming, 2015-01-20 21:35
Pokaż pozostałe 29 komentarzy
Uważaj, bo za multikonto przewidziana jest nagroda w postaci multibana; A wyśledzenie Twojego nowego konta to naprawdę kilka minut roboty; - furious programming 2015-01-20 22:56
@fasadin ty za to jesteś tak kompetentną osobą, że sposób który napisałeś, nie ma nic wspólnego z moim zadaniem... - SPOJowiecaa 2015-01-20 23:00
Proszę zakończyć już tę dyskusję - bo użyję innego koloru; - furious programming 2015-01-20 23:02
to proszę na początku ukarać siebie, za prowokowanie do kłótni, ja już dawno tą rozmowę skończyłem... nie ma to jak się wywyższać nad innych i nie zauważać problemu w sobie, już skończyłem, mam nadzieję, że Wy też... - SPOJowiecaa 2015-01-20 23:04
Ciekawa interpretacja, ale Ok - ukarzę siebie i przez miesiąc nie będę moderował wątków z kodami w C; - furious programming 2015-01-20 23:12

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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