Witam. Napisałem program, który pobiera od użytkownika nazwę pliku do otwarcia oraz umożliwia podanie podanie położenia w pliku i wyświetla część pliku od tego miejsca do najbliższego znaku nowej linii. Oto kod:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX 41
int main(void)
{
FILE *wsk;
int i;
long int a;
char nazwa[MAX];
char ch;
puts("Podaj nazwe pliku");
puts("Wprowadz pusta linie aby zakonczyc");
if (gets(nazwa) != NULL && nazwa[0] != '\0')
{
if ((wsk = fopen(nazwa, "r")) == NULL)
{
puts("Blad otwarcia pliku");
exit(1);
}
puts("Podaj polozenie w pliku");
while (scanf("%ld", &a) == 1)
{
if (fseek(wsk, a, SEEK_SET) != 0)
{
puts("Wyszedles poza granice pliku!");
puts("Podaj polozenie pliku");
puts("Wprowadz dana nienumeryczna aby zakonczyc");
continue;
}
else
{
while((ch = getc(wsk)) != EOF && ch != '\n')
{
putc(ch, stdout);
}
}
puts("\nPodaj polozenie pliku");
puts("Wprowadz dana nienumeryczna aby zakonczyc");
}
}
getchar();
getchar();
return 0;
}
I tutaj mam parę pytań. Przykładowo w pliku zapisano coś takiego:
ABCDEFGHIJKLMNO
PRSTUWXYZ
Podając np. 0 wszystko jest ok i program wyświetla ABCDEFGHIJKLMNO, jednak kiedy np podam 15 lub 16 to wyświetla mi się coś takiego:
Podaj polozenie w pliku
15Podaj polozenie pliku.
Wprowadz dana nienumeryczna aby zakonczyc
I chodzi mi tutaj dokładnie o ten Enter po 15. Program tak jakby odczytywał przy 15 i 16 znak nowej linii czy coś takiego. Po wprowadzeniu 15 w miejsce w pliku zostaje ustawione po literze O. Czyli w miejscu gdzie nic dalej nie ma. Moim zdaniem wpisanie 15 powinno spowodować przejście przed P i odczytanie PRSTUWXYZ. Jednak linijkę PRSTUWXYZ otrzymuję dopiero po wpisaniu 17. Czemu się tak dzieje?
Kolejne moje pytanie dotyczy wartości zwracanej przez fseek. Przeczytałem, że gdy wszystko jest ok fseek zwraca 0 a gdy coś poszło nie tak, np. próba przekroczenia granicy pliku zwraca -1. Więc napisałem coś takiego:
if (fseek(wsk, a, SEEK_SET) != 0)
{
puts("Wyszedles poza granice pliku!");
puts("Podaj polozenie pliku");
puts("Wprowadz dana nienumeryczna aby zakonczyc");
continue;
}
Wydawało by mi się, że w przypadku gdy wpiszę np. 50 (co jest poza granicą wcześniej podanego pliku tekstowego) program powinien wyświetlić to co jest w pętli i przejść od nowa do pobrania miejsca w pliku. Jednak tak się nie dzieje i po wpisaniu 50 otrzymuję coś takiego jak powyżej:
Podaj polozenie w pliku
50Podaj polozenie pliku.
Wprowadz dana nienumeryczna aby zakonczyc
I ostatnie moje pytanie dotyczy funkcji scanf. W pętli while (scanf("%ld", &a) == 1) odczytywane są wartości do momentu wprowadzenia np. jakiejś litery. Jednak np. gdy wprowadzę zamiast jednej wartości, trzy: 2 4 6 to wyświetla mi się wszystko potem trzy razy. Te wartości 4 i 6 widać pozostają w buforze i potem są odczytywane, jednak wolałbym żeby scanf odczytywał tylko jedną wartość a resztę np. porzucał. Czy istniej taka możliwość?