[C] Edycja pliku tekstowego- porównywanie

Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C] Edycja pliku tekstowego- porównywanie

Post autor: miki999 »

Witam,
nie jestem pasjonatem programowania, a chciałbym zrealizować pewną rzecz.
Mianowicie mam plik tekstowy (nazwijmy go baza.txt). Znajdują się tam imiona, nazwiska itp. w następującej formie

Kod: Zaznacz cały

Jan Kowalski Blalalla blalala
Elton John Elelelele eelelelele
itd.
Chciałbym napisać funkcję, która znajdzie (a konkretnie pozwoli edytować) dany wiersz w zależności od tego po czym szukam:
- po imieniu
- po nazwisku
- po 3 kolumnie
- po 4 kolumnie

Zakładam, że zacznie się to tak:

Kod: Zaznacz cały

	plik=fopen("baza.txt", "r+");
A dalej?
Czytać po linii? Po znaku?
Nie wiem jak najlepiej to zrobić. Cenię prostotę umysłową, czyli brak wskaźników wskazujących wskazujące wskaźniki.
Może być np. na switchu zrobione, czyli po podaniu kolumny przez użytkownika

Kod: Zaznacz cały

case 1:
printf("
Podaj imie: ");


break;
case 2:
printf("
Podaj nazwisko: ");


break;
case 3:
printf("
Podaj lalala: ");


break;
case 4:
printf("
Podaj blelel: ");


break;
Nie mam pomysłu, jak to zgrabnie uzupełnić.

Będę wdzięczny za pomoc.

edit.
Jedyne co mi przychodzi do głowy, to wczytać linijkę tekstu do tablicy, następnie policzyć spacje i porównywać znak po znaku, ale nie wiem czy nie ma zgrabniejszego sposobu.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C] Edycja pliku tekstowego- porównywanie

Post autor: soku11 »

Operacje na tekście w C ciężko zrealizować. Szczególnie, że nie chcesz używać wskaźników itd. Już lepsze jest chociażby C++ gdzie masz coś takiego jak string.
Ogólnie w teorii wystarczy wczytać n-tą linię i podzielić ją po spacjach. Każdy taki element to twoja kolumna. Kwestia tego, że nazwisko może być dwuczłonowe i wtedy dostaniemy za dużo kolumn. Potrzebny jest więc pewnie jakiś znacznik rozdzielający.
Kod wydzielający kolumny z linii w C++:

Kod: Zaznacz cały

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <vector>
using namespace std;

void splitIntoVector(const string& line, vector<string>& result)
{
	istringstream stream(line);

	copy(istream_iterator<string>(stream), istream_iterator<string>(),
			back_inserter<vector<string> >(result));
}

int main()
{
	string sentence = "Something in the way she moves...";

	vector<string> tokens;
	splitIntoVector(sentence, tokens);

	copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, "|"));

	return EXIT_SUCCESS;
}

Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C] Edycja pliku tekstowego- porównywanie

Post autor: miki999 »

No tak, może i lepsze, ale jeżeli mam być szczery to z tego niewiele rozumiem

W każdym razie mam kolejne pytanie:

Kod: Zaznacz cały

plik=fopen("baza.txt", "r+");
Dalej w pętli sprawdzam czy jest zgodność w danej linijce. Jeżeli jest to chciałbym edytować wiersz, więc chciałem użyć:

Kod: Zaznacz cały

fputs("Jakiś nowy tekst w linijce, w ktorej zostala zanotowana zgodnosc", plik); 
Jednak teraz jest problem, bo do pliku nic się nie zapisuje. Może jest to wina "r+" w funkcji fopen?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C] Edycja pliku tekstowego- porównywanie

Post autor: soku11 »

Ten kod po prostu dzieli wczytany tekst po whitespace'ach. W main wypisuje wektor.


Co do samego problemu, to zamiast robić podmianę radzę wszystko robić na pliku tymczasowym. Po skończeniu operacji na strukturach programu tworzysz plik tymczasowy z podmienionymi już zawartościami. Na końcu podmieniasz sam plik. Lepiej bezpieczniej i bez kombinacji.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C] Edycja pliku tekstowego- porównywanie

Post autor: miki999 »

O dziwo właśnie tak zrobiłem
Problem udało mi się jakoś już rozwiązać (mniej lub bardziej elegancko).

W każdym razie dzięki wielkie za pomoc.
ODPOWIEDZ