Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wczytanie z pliku + wykasowanie znaku + zapis do pliku zmian

Ostatnio zmodyfikowano 2016-09-28 10:23
Autor Wiadomość
Sebastian__Zak
Temat założony przez niniejszego użytkownika
Wczytanie z pliku + wykasowanie znaku + zapis do pliku zmian
» 2016-09-22 20:56:56
Cześć
Poproszę o pomoc z tematem który nie daje mi spać ...
Chciałbym otworzyć plik - może być test.txt, wykasować tam jakiś określony znak np. 'D'i z powrotem zapisać ten plik (ale już bez tych znaków)
To co do tej pory naskrobałem to:

C/C++
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void RemoveCharFromString( char * p, char c )
{
    if( NULL == p )
         return;
   
    char * pDes = p;
   
    while( * p )
    {
        if( * p != c )
             * pDes++ = * p;
       
        p++;
    }
    * pDes = '\0';
}

int main()
{
    string tekst;
    ifstream mojplik( "abc.fil" );
   
    if( mojplik.is_open() )
    {
        while( mojplik.good() )
        {
            getline( mojplik, tekst );
            cout << tekst << endl;
        }
        mojplik.close();
    }
    RemoveCharFromString( tekst, 'D' );
    return 0;
}
P-151919
carlosmay
» 2016-09-22 22:46:49
  • Otwórz plik.
  • Wczytaj zawartość pliku.
  • Wyszukaj i usuń znaki.
  • Wyczyść zawartość pliku.
  • Zapisz dane do pliku

Edit:
Można tak:
C/C++
#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>

void readTextFromFile( const std::string & fileName, std::string & text )
{
    std::ifstream fin( fileName );
    if( fin.is_open() )
    {
        std::getline( fin, text );
    }
    else
    {
        std::cerr << "pliku nie udalo sie otworzyc\n";
    }
}

void eraseCharacters( std::string & text )
{
    std::string wynik;
    text.erase( std::remove_if( text.begin(), text.end(),
    []( char ch ) { return ch == 'D'; } ),
    text.end() );
}

void saveTextToFile( const std::string & fileName, std::string text )
{
    std::ofstream fout( fileName );
    fout << text.c_str();
}

int main()
{
    std::string fileName { anyFileName };
    std::string text;
    readTextFromFile( fileName, text );
    std::cout << text << '\n';
    eraseCharacters( text );
    std::cout << text << '\n';
    saveTextToFile( fileName, text );
}

aDaDaDaD
aaaa
P-151925
Sebastian__Zak
Temat założony przez niniejszego użytkownika
» 2016-09-23 15:47:56
Dziękuje za pomoc, ale wywala mi błędy typu:

line 23: error: no matching function for call to ' remove_if(std::string<car>::iterator, std::basic_string<car>::iterator, eraseCharacters(std::string&)::<lambda(char)>)'

Proszę o podpowiedź co zrobić.
P-151939
karambaHZP
» 2016-09-23 17:16:10
Lambdy są od C++11. Musisz włączyć ten standard w opcjach kompilatora.
Najlepiej włączyć najnowszy dostępny standard.
P-151941
Sebastian__Zak
Temat założony przez niniejszego użytkownika
» 2016-09-26 10:49:38
OK dziękuje za Wasze rady - wszystko działa (bez Waszej pomocy bym tego nie ustawił) :)
Co do zaczytywania pliku to mam jedno pytanko jak poprawić program aby zaczytywał więcej niż jedną linie?
Program zaczytuje mi zawsze jedną linie (i usuwa z niej określony znak) ale nie widzi kolejnych linii ...

Domyślam się, że problem jest w tym miejscu:
C/C++
if( fin.is_open() )
{
    std::getline( fin, text );
   
}

Jak to przerobić aby zaczytał mi zawszę cały plik txt?
P-152039
carlosmay
» 2016-09-26 12:16:25
Jak to przerobić aby zaczytał mi zawszę cały plik txt?
Użyj pętli.
C/C++
while( std::getline( fin, text ) ) {
    // obsługa pobranych danych
}
P-152040
Sebastian__Zak
Temat założony przez niniejszego użytkownika
» 2016-09-26 20:19:19
Witam ponownie
Bawię się tym kodem i jedno zaczyna działać to drugie przestaje ...
Zaczytuje mi całość, ale przestaje działać kasowanie i zapisywanie (zapisuje puste pliki).
Nie rozumiem dodałem tylko pętle while jak kolega polecił wcześniej i się posypało.
Poproszę o jakieś wskazówki do dalszej zabawy ponieważ sam tego nie rozwiąże.
 Mój kod:

C/C++
#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>

void readTextFromFile( const std::string & fileName, std::string & text )
{
    std::ifstream fin( "test.txt" );
   
    while( !fin.eof() ) {
       
        std::getline( fin, text );
        std::cout << text << std::endl;
    }
}

void eraseCharacters( std::string & text )
{
    std::string wynik;
    text.erase( std::remove_if( text.begin(), text.end(),
    []( char ch ) { return ch == '"'; } ),
    text.end() );
}

void saveTextToFile( const std::string & fileName, std::string text )
{
    std::ofstream fout( "test_new.txt" );
    fout << text.c_str();
}

int main()
{
    std::string fileName { "test.txt" };
    std::string text;
    readTextFromFile( fileName, text );
    eraseCharacters( text );
    std::cout << text << '\n';
    saveTextToFile( fileName, text );
}
P-152061
karambaHZP
» 2016-09-26 20:32:46
Zmienna
tekst
 jest nadpisywana ipo wyjściu z funkcji odczytującej z pliku
zawiera ostatni wiersz. Dodaj jakiś kontener: np
std::vector < std::string >
 i do niego zapisuj wczytane wiersze z pliku.
P-152063
« 1 » 2
  Strona 1 z 2 Następna strona