• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Usuwanie/modyfikacja linii w pliku tekstowym [C]

Object Storage Arubacloud
0 głosów
2,390 wizyt
pytanie zadane 1 marca 2017 w C i C++ przez lukasz9819 Początkujący (360 p.)
zamknięte 3 marca 2017 przez lukasz9819
Piszę program który ma za zadanie dodawać, modyfikować, usuwać dane zawarte w pliku tekstowym. O ile dodawanie na końcu nie sprawiło mi większego kłopotu tak nie mogę poradzić sobie z pozostałymi dwoma zagadnieniami. Modyfikowanie i usuwanie ma się odbywać na zasadzie że wczytuję z klawiatury słowo a z pliku jeżeli to słowo istniej ma zostać usunięte/zmodyfikowane. Nie biorę pod uwagę przypadku że słowo się powtarza. Każde słowo jest w osobnej linii. Z tego co do tej pory udało mi się dowiedzieć, to muszę sprawdzać słowa i jeżeli się nie zgadzają przepisywać do nowego pliku, w momencie gdy się zgodzą mam nie przepisać a w przypadku modyfikacji po prostu na miejsce wpisać to co chcę. Tyle że nie mam pojęcia jakich komend zastosować a nawet jak udaje mi się coś znaleźć to nic mi nie mówią co mam wpisać w środek danej komendy tak żeby to działało. Proszę o pomoc.
Edit. Jak w tytule muszę to napisać w C
komentarz zamknięcia: Ukończyłem pracę z pomocą kuzyna, forum pomogło również

3 odpowiedzi

0 głosów
odpowiedź 1 marca 2017 przez tangarr Mędrzec (154,860 p.)
wybrane 3 marca 2017 przez lukasz9819
 
Najlepsza

Poczytaj o funkcjach getline i strcmp

komentarz 2 marca 2017 przez lukasz9819 Początkujący (360 p.)
 #define _GNU_SOURCE
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(void)
       {
           FILE *stream;
           char *line = NULL;
           size_t len = 0;
           ssize_t read;

           stream = fopen("tow.txt", "r"); //zmieniłem tylko plik w porównaniu do strony
           if (stream == NULL)
               exit(EXIT_FAILURE);

           while ((read = getline(&line, &len, stream)) != -1) {
               printf("Retrieved line of length %zu :\n", read);
               printf("%s", line);
           }

           free(line);
           fclose(stream);
           exit(EXIT_SUCCESS);
       }

 

komentarz 2 marca 2017 przez Evelek Nałogowiec (28,960 p.)
Nie mam pojęcia. Nie używałem nigdy getline w ten sposób.
komentarz 2 marca 2017 przez lukasz9819 Początkujący (360 p.)
A mógłbyś podać przykład w jaki sposób używałeś?
1
komentarz 2 marca 2017 przez Evelek Nałogowiec (28,960 p.)
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
   fstream plik;
   string dane;
   plik.open("nazwa_pliku.txt", ios::in);

   while(!plik.eof()) {
      getline(plik, dane);
   }
   plik.close();
}

Przykład z C++.

komentarz 2 marca 2017 przez lukasz9819 Początkujący (360 p.)
C++ niestety nie znam w ogóle. Ale dzięki :)
+1 głos
odpowiedź 2 marca 2017 przez tangarr Mędrzec (154,860 p.)

Pogooglowałem chwilę i znalazłem informację że funkcja getline należy do standardu POSIX i nie jest dostępna na windowsa.

Będziesz musiał sam sobie napisać taką funkcję przy użyciu fgetc (inny link)
Warunkiem ukończenia funkcji jest wczytanie znaku końca linii '\n' lub znak końca lini EOF.
Dla ułatwienia możesz użyć statycznego buforu o ustalonej długości (np 1024).
Nie zapomnij dodać zera na końcu wczytanej linii.

komentarz 2 marca 2017 przez lukasz9819 Początkujący (360 p.)
Czy mógłbyś poświęcić trochę czasu i opisać mi mniej więcej jak to zrobił wyżej kolega z funkcją  strcmp()? Byłbym bardzo wdzięczny.
1
komentarz 2 marca 2017 przez tangarr Mędrzec (154,860 p.)

Mniej więcej coś takiego:

int getline(char* buffer, ssize_t size, FILE* file) {
   int c;
   ssize_t len=0;
   while (1) {
       /* wczytujemy 1 znak z pliku */
       c = fgetc(file);
       /* sprawdzamy czy koniec pliku */
       if (c == EOF) {
           /* zwracamy -1 jezeli nie zapisano zadnego znaku do buffora */
           if (len==0)
               return -1;
           break;
       }
      /* sprawdzamy koniec linii */
       if (c == '\n')
           break;
       buffer[len]=(char)c;
       ++len;
       if (len+1<=size) {
           /* zbyt mały buffor */
           buffer[len]=0;
           return -1;
       }
   }
   /* ustawiamy zero na końcu łańcucha */
   buffer[len]=0;
   return 0;
}

Przykład użycia

char buffer[1024];
while (!getline(buffer, 1024, plik) {
    printf("Wczytano linię: %s\n", buffer);
}

Ale ostrzegam, nie kompilowałem tego

0 głosów
odpowiedź 2 marca 2017 przez mokrowski Mędrzec (155,460 p.)
Powiedz kolego jak chcesz dać szansę by Ci pomóc? Nie publikujesz kodu rozwiązania które już masz, nie informujesz o błędach które zgłasza kompilator...

Zgaduję że albo chcesz żeby to ktoś za Ciebie napisał albo oczekujesz że pojawia się na forum brat Wróżbity Macieja który programuje w C :-) Moja szklana kula nie działa bo ma nietypowe baterie i jeszcze nie kupiłem nowych :-) Albo daj sobie pomóc na sensownych zasadach albo napisz wyraźnie że oczekujesz rozwiązania.
komentarz 2 marca 2017 przez lukasz9819 Początkujący (360 p.)

Potrzebuję żeby mi ktoś powiedział jakich funkcji użyć i jakie dokładnie powinny być tam argumenty ewentualnie przykładowy program. Jak można wywnioskować z wyższych wiadomości, kolega Evelek wytłumaczył mi strcmp(). A omawiamy program przykładowy ze strony http://man7.org/linux/man-pages/man3/getdelim.3.html

1
komentarz 2 marca 2017 przez mokrowski Mędrzec (155,460 p.)

Prócz tych które znasz, interesuje Cię jeszcze  funkcja:

  • strpbrk() - odnalezienie danego znaku (tu np. spacja i tabulator) aby wstawić tam koniec ciągu znaków czyli '\0' (tu Ci pokażę kod)
#include <string.h>

// Z linii pozostawia pierwsze słowo
void line_to_word(char * str) {
    char * end_ptr = strpbrk(str, " \t"); // zwrócenie wkaźnika do znaku tabulatora lub spacji
    if(end_ptr != NULL) {
        *end_ptr = '\0';
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 517 wizyt
pytanie zadane 31 grudnia 2015 w C i C++ przez Jonki Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 998 wizyt
pytanie zadane 12 listopada 2020 w C i C++ przez Bartek030 Obywatel (1,460 p.)
0 głosów
1 odpowiedź 461 wizyt
pytanie zadane 11 października 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...