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

Język C- wpisywanie stringów i odczyt ich z plików *.txt

Object Storage Arubacloud
0 głosów
1,468 wizyt
pytanie zadane 8 czerwca 2016 w C i C++ przez Talson_z_dachu Nowicjusz (150 p.)
edycja 8 czerwca 2016 przez Patrycjerz

Witajcie! Pytanie z podstaw, ale sprawia mi trochę kłopotu, będę ogromnie wdzięczna za pomoc.

 

Język C: Moim zadaniem jest zapisanie w pliku tekstu a następnie wyświetlenie jego zawartości na konsoli. 

Póki co mam coś takiego: 

#include <stdio.h>

int main (void)
{
	
	FILE *f;
	f=fopen("tekst.txt", "w+");
	
	if(f==NULL) 
	{
	printf("Blad wczytania pliku");
	return -1;
	}
	char a [100];
	
	do
	{	
	printf("Wstaw linijke: ");
	gets(a);
	fputs(a, f);
	}		
	while (a!='\n');
	
	while (fscanf(f, "%s", &a) != EOF)
	{
	fscanf(f, "%s", &a);
	printf("%s", a);
	}

	fclose(f);		
}

Ważne jest, aby wysłanie pustej linijki (wciśnięcie enter bez poprzedzających znaków) zakończyło pętlę 'wpisującą'. Jak to osiągnąć?

Po drugie, nie wiem jak wypisać treść na konsoli. Kod u góry wpisuje mi bezsensowny ciąg liter... (tzn oczywiście w wypadku, gdy pominę pierwszą pętlę, a w pliku będzie gotowy tekst) Jak to naprawić?

Z góry dziękuję!

 

2 odpowiedzi

0 głosów
odpowiedź 8 czerwca 2016 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 10 czerwca 2016 przez Talson_z_dachu
 
Najlepsza

Wszystko, czego potrzebujesz, znajduje się w sieci - wystarczy przełamać swoje lenistwo i spojrzeć przynajmniej na dokumentacje funkcji, których używasz...

  1. Funkcja gets działa na takiej zasadzie, że przyjmuje tekst aż do naciśnięcia entera (czyli znak nowej linii \n), a potem zwraca wartość do podanej w argumencie tablicy char, zamieniając \n na \0, czyli znak końca stringa. Jeśli wciśniesz sam enter, do tablicy zostanie wprowadzony tylko NULL, więc łatwo stwierdzić, kiedy zaprzestać wczytywanie kolejnych danych.
  2. Zastosuj funkcję rewind, która umożliwia przesunięcie kursora pliku na sam początek, gdyż po operacjach z zapisywaniem kursor znajduje się na końcu pliku i przy próbie użycia funkcji fscanf nie ma ona czego wczytywać i zwraca niezdefiniowane wartości.
komentarz 10 czerwca 2016 przez Talson_z_dachu Nowicjusz (150 p.)

Patrycjerze;

Ogromne dzięki. Co do dokumentacji, pewnie masz rację, niemniej jestem jeszcze zieleńsza od wiosny w temacie programowania i czytanie dokumentacji jest dla mnie trudne, ze względu na specyficzny żargon. Wydaje mi się, że rozumiem, po czym- nie działa. Tak czy siak, będę nad tym pracować.

1. Dodałam zmienną x typu char, zmodyfikowałam kod i nadal pudło. Również wypróbowanie sposobu z powyżej, wczytującego wartość 1 argumentu tablicy a, pobieranej za pomocą fgets() nie daje rady.

do
	{	
	printf("Wstaw linijke: ");
	x= gets(a);
	fputs(a, f);
	}		
	while (x!=NULL);

2.  po przesunięciu kursora fscanf() działa, lecz pobiera słowa od drugiego, wpisując bez spacji i enterów. pobieranie fgets() rozwiązuje problem spacji i enterów, ale również nie pobiera pierwszej linijki i pobiera wyłącznie te, w których nie napotyka spacji. Nie rozumiem dlaczego.

 

Pozdrawiam i dziękuję!

0 głosów
odpowiedź 8 czerwca 2016 przez mrcnsct Nałogowiec (36,390 p.)
edycja 8 czerwca 2016 przez mrcnsct

W 24 linijce wczytujesz coś z pliku, a w 26 znowu coś wczytujesz, wystarczy tylko w warunku pętli. a jest tablicą, więc przy fscanf nie trzeba &a, tylko samo a. Napisy lepiej wczytywać przez fgets() niż przez gets(), bo gets() nie sprawdza czy jest miejsce w tablicy https://pl.wikibooks.org/wiki/C/gets. Co do zakończenia enterem to spróbuj sprawdzić czy a[0]!='\n'. Do a wczytaj przez fgets(a,100,stdin). (fgets zapisuje do tablicy '\n'). Jeszcze wróć do początku przez fseek przed wczytywaniem z pliku.

Podobne pytania

0 głosów
1 odpowiedź 133 wizyt
pytanie zadane 19 grudnia 2016 w C i C++ przez R4leY Nowicjusz (180 p.)
+1 głos
1 odpowiedź 582 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...