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

Kasowanie tekstu z pliku

Ostatnio zmodyfikowano 2017-01-23 14:50
Autor Wiadomość
Krway
Temat założony przez niniejszego użytkownika
Kasowanie tekstu z pliku
» 2017-01-22 16:45:30
Witam.
Piszę program który działa z plikiem i teraz chciałbym wprowadzić możliwość usunięcia z niego wybranych danych. Nie mam pomysłu jak to zrobić, myślałem o tym by od nowa zapisać wszystkie dane w pliku bez wybranego tekstu, ale to jest chyba przekombinowanie. Zna ktoś jakiś sposób by np. usunąć wybraną linijkę z pliku? I jak by się jeszcze podzielił tą wiedzą to byłbym wdzięczny :D
Dzięki za wszelkie odpowiedzi ;)
P-156781
carlosmay
» 2017-01-22 18:12:05
Jeśli danych nie jest zbyt dużo to wcale nie jest przekombinowane.
Sposób może jeszcze zależeć od samych danych w pliku, sposobu odczytu i zapisu itd.
P-156783
Krway
Temat założony przez niniejszego użytkownika
» 2017-01-22 19:25:11
Okej dzięki, czyli rozwiązaniem problemu będzie zapisanie znów do pliku wszystkich danych bez wybranego tekstu.(Tak dla odwiedzających)
P-156791
mokrowski
» 2017-01-22 21:14:17
Czasem nie ma wyjścia bo ilość pamięci RAM + swap systemu jest tak mała że operacje choć powolnie można wykonać tylko na pliku. Tu masz kilka przykładów jakie miałem po ręką. Nie daję głowy czy już ich nie umieszczałem bo są z mojego katalogu "śmieci i inne takie przydasie" :-)
Program odwracający słowo w pliku:
#include <iostream>
#include <string>
#include <iterator>
#include <fstream>
#include <algorithm>

using namespace std;

int main() {
    ifstream infile("slowa.txt", ios::in | ios::binary);
    ofstream outfile("slowa.txt", ios::in | ios::out | ios::binary);
    for_each(istream_iterator<string>(infile), istream_iterator<string>(),
            [&infile, &outfile](string word) {
                auto word_size = word.size();
                if(1 < word_size) {
                    swap(word.front(), word.back());
                    outfile.seekp(infile.tellg(), ios_base::beg);
                    outfile.seekp(-word_size, ios_base::cur);
                    outfile << word;
                }
    });
}
No i przykład w C'e :-)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // Dla MS Win nie ma tego nagłówka, patrz uwaga o SetEndOfFile()
#include <string.h>

int main() {
    char pattern[] = "300\n";
    const char file_name[] = "data.txt";
    ssize_t line_count;
    size_t len = 0;
    char * line = NULL;

    FILE * reader = fopen(file_name, "rb");
    FILE * writer = fopen(file_name, "r+b");

    if((reader == NULL) || (writer == NULL)) {
        perror("Open file error");
        exit(EXIT_FAILURE);
    }

    while((line_count = getline(&line, &len, reader)) != -1) {
        printf("%s", line);
        if(strcmp(line, pattern)) {
            printf("TRAFIONO!\n");
            fputs(line, writer);
        }
    }
    long position = ftell(writer);
    /* Dla MS Win masz SetEndOfFile() */
    ftruncate(fileno(writer), position);

    return EXIT_FAILURE;
}
/* W pliku data.txt znajdują się pierwotnie...
100
200
300
400
500
*/
/* Po operacji usunięto linijkę z 300 */
P-156800
Krway
Temat założony przez niniejszego użytkownika
» 2017-01-23 14:50:32
woo to muszę się wiele jeszcze pouczyć :D
P-156830
« 1 »
  Strona 1 z 1