Operacje na plikach

0

Witajcie, mam problem. Muszę pobrać od użytkownika nazwę plików w jakich będę później w programie pracował, ale zawsze program wchodzi w pętle i ani rusz dalej. Nie wiem co jest grane. Powiem dodatkowo, że na dobrą sprawę nie wiem jak napis wczytać od użytkownika, nie wiem czy to fgets() jest tutaj dobrze użyte.

#define ZNK 19

int main()
{
	para tab[ROZ];
	FILE *we,*wy;
	char dane[ZNK], wyjscie[ZNK];

	printf("podaj nazwe pliku z danymi (max 15 znakow)");
	fgets(dane,ZNK,stdin);
	//strcat(dane,".txt");
	printf("\npodaj nazwe pliku wyjscia (max 15 znakow)");
	fgets(wyjscie,ZNK,stdin);
	strcat(wyjscie,".txt");

	if((we=fopen(dane,"r"))==NULL)
	{
		fprintf(stdin,"Nie moge otworzyc pliku z danymi");
		exit(1);
	}
	if((wy=fopen(wyjscie,"a+"))==NULL)
	{
		fprintf(stdin,"Nie moge otworzyc pliku wyjscia");
		exit(2);
	}
	return 0;
}

Od razu mówię, że mam przygotowany plik .txt z którego chciałem skorzystać ;p

1
  1. ponieważ przy printfie nie masz końca linii, to nie zobaczysz napisów przed fgets-em
  2. fgets wczyta ci też znak końca linii
  3. ograniczasz string wczytywany przez fgets do ZNK znaków a pozniej dodajesz kolejne 4, czyli kolejne miejsce potencjalnych problemów
  4. fprintf jak już to do stdout
  5. nie zamykasz otwartych plików

to tyle na szybko - jak poprawisz to wszystko zauważone na prędce i dalej nie będzie działać, to przyjrzę się dokładniej

0
kaczus napisał(a):
  1. fgets wczyta ci też znak końca linii

to w takim razie czego użyć?

  1. ograniczasz string wczytywany przez fgets do ZNK znaków a pozniej dodajesz kolejne 4, czyli kolejne miejsce potencjalnych problemów

chodzi Ci o to, że plik, który podaję ma być równy ZNK?

  1. nie zamykasz otwartych plików

bo nawet ich jeszcze nie wczytałem :/

poprawienie znaczników <quote> - @furious programming

1

ad 2. można fgetsa - jednak pamiętając, że trzeba go przyciąć o znak końca linii
ad 3. podajesz, że chcesz wczytać maksymalnie ZNK znaków i jeśli ktoś tyle poda, albo niedużo mniej, to strcat późniejszy zamaże nie swoją pamięć.
ad 5. jeśli dojdziesz do drugiego warunku, to jeden plik już jest otwarty.

0
kaczus napisał(a):

ad 2. można fgetsa - jednak pamiętając, że trzeba go przyciąć o znak końca linii

No tak, tylko jak? :/ Jest jakaś funkcja która ostatni znak usuwa?

Mam ogólny pomysł, żeby strlen(dane) zapisać do zmiennej int liczba i po prostu dla dane[liczba] zapisać, żeby usunąć plik, ale nie wiem co wpisać, jak wyczyścić komórkę?

Dobra, mam. :P Trochę w prowizoryczny sposób ale mam.

int	liczba=0;

	printf("podaj nazwe pliku z danymi (max 15 znakow)\n");
	fgets(dane,ZNK,stdin);
	liczba=strlen(dane);
	dane[liczba]='Ě';
	//strcat(dane,".txt");
	printf("\npodaj nazwe pliku wyjscia (max 15 znakow)\n");
	fgets(wyjscie,ZNK,stdin);
	liczba=strlen(wyjscie);
	wyjscie[liczba]='Ě';
kaczus napisał(a):

ad 3. podajesz, że chcesz wczytać maksymalnie ZNK znaków i jeśli ktoś tyle poda, albo niedużo mniej, to strcat późniejszy zamaże nie swoją pamięć.

Ale napisałem w printfie, że max 15 znaków, a w define jest 19, jeżeli o to chodzi.

1

ad 2. na przykład tak:

if (dane[strlen(dane) - 1] == '\n')
  dane[strlen(dane) - 1]  = 0;

ad 3. czyli maksymalnie można podać 14 znaków, a nie 15 - bo tak na prawdę możesz mieć 18 znaków (jeden jest potrzebny na znak końca ciągu znaków), ale wtedy również powinieneś w fgetsie to ograniczenie wstawić (czyli 15 - wtedy fgets przypilnuje, by było maksymalnie 14 znaków)

0

Dobra, dzięki wielkie, pierwszy etap mojej katorgi za mną :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1