Strona 1 z 1

Pierwszy program w C - znikające zmienne

: 10 maja 2012, 16:43
autor: sponsoriada
Witam.
T
o mój pierwszy program w C, więc proszę o wyjaśnienia ludzkim językiem.
Program prosi o ścieżki do dwóch plików - plik1, plik2.
[INDENT]plik1 - jest to ścieżka pliku, który ma być skopiowany
plik2 - ścieżka do pliku (kopia)[/INDENT]

Doszedłem do momentu gdzie znika mi wartość zmiennej plik2.

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(int argc,char **argv ) {
	char plik1[40];
	char plik2[40];
	char odp[1];
	char *yes = "y";
	char *no = "n";
	FILE *fp;
	FILE *sp;
	printf("%s\n", "Podaj sciezke plikow:");
	scanf("%40s %40s", &plik1, &plik2);
	//otwieranie pliku do odczytu
	if((fp = fopen(plik1, "r"))== NULL ) {
		printf("Nie moge odczytac pliku %s do odczytu", plik1);
		exit(1);
	}
	//otwieranie pliku do zapisu
	if((sp = fopen(plik2, "rw"))== NULL) {
		
		printf("Nie moge odczytac pliku %s do zapisu\n", plik2);
		printf("Czy utworzyć plik do zapisu o sciezce %s ?\n (y\\n)", plik2);
		scanf("%1s", &odp);
		//porownywanie odpowiedzi
		if(strcmp(odp, yes)==0) {
			//TUTAJ ZMIENNA PLIK2 JEST JUZ PUSTA
			if((sp = fopen(plik2, "w"))!= NULL) {
				printf("Utworzony");
			} else {
				printf("Nie można utworzyć pliku - sprawdz uprawnienia\n");
				printf("%s\n", plik2);
				exit(1);
			}
		} else if(strcmp(odp, no)==0) {
			printf("Koniec programu\n");
			exit(0);
		} else {
			printf("Zla odpowiedz\n");
			exit(1);
		}
	}
	
    
}
Jest to jeszcze nieskończony program.
Proszę o pomoc.

: 10 maja 2012, 17:36
autor: grucha
Nie mam teraz tego jak skompilować, ale spróbuj zwiększyć rozmiar odp, może wrzuca tam coś więcej niż 1 bajt i nadpisuje Ci ten plik2.

: 11 maja 2012, 00:47
autor: Czocher
Narobiłeś w tym programie niezłych dziwactw. Polecam zapoznać się z jakąś literaturą dotyczącą języka, bo prawdę mówiąc błędów i dziwnych konstrukcji jest tak wiele, że nawet nie chce mi się ich wszystkich opisywać. Podam przykład:

Kod: Zaznacz cały

printf("%s\n", "Podaj sciezke plikow:");
Czemu tak, skoro można równie dobrze tak:

Kod: Zaznacz cały

printf("Podaj sciezke plikow:\n");
Takich rodzynek jest o wiele więcej ;) .

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(void) {
    char plik1[40];
    char plik2[40];
    int odp = 0;
    FILE *fp = NULL;
    FILE *sp = NULL;

    printf("Podaj sciezke pliku1:");
    fgets(plik1, 40, stdin);

    printf("Podaj sciezke pliku2:");
    fgets(plik2, 40, stdin);

    /* otwieranie pliku do odczytu */
    fp = fopen(plik1, "r");
    if(fp == NULL) {
        perror("Blad otwarcia pliku1");
        exit(EXIT_FAILURE);
    }

    printf("Czy utworzyć plik do zapisu o sciezce %s ?\n (y\\n)", plik2);
    odp = getchar();
    if(odp == 'n') {
        exit(EXIT_SUCCESS);
    }

    /* otwieranie pliku do zapisu */
    sp = fopen(plik2, "rw");
    if(sp == NULL) {
        perror("Blad otwarcia pliku2");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}
Tutaj dałem ci pewną wersję poglądową. Użyłem paru przydatnych funkcji i standardowych praktyk. Poczytaj, poucz się, potem zacznij kodzić.

: 11 maja 2012, 10:14
autor: sponsoriada
Dziękuję bardzo. Niestety fopen nie chce mi działać, cały czas dostaję błąd otwarcia pliku - plik nie istnieje. Jak wpiszę ścieżkę z palca to działa.

Poradziłem sobie przez zastąpienie fgets na scanf.

Mam teraz jeszcze pytanie, jakimi funkcjami mogę kopiować pliki. Prosiłbym o jakieś podpowiedzi.
Niestety ta funkcja mi nie działa ;(

Kod: Zaznacz cały

int kopiuj(FILE *plik1, FILE *plik2) {
	long size;
	size_t bajty = 0;
	int bufer = 4096;
	char temp[4096];
	
	
	/*sprawdzenie wielkosci pliku*/
	fseek(plik1, 0, SEEK_END);
	size=ftell(plik1);
	/*ustawianie na poczatkupliku*/
	fseek(plik1, 0, SEEK_SET);
	if(size == 0) {
		printf("Plik zrodlowy jest pusty\n");
		exit(EXIT_SUCCESS);
	}
	/*zapisywanie do bufora */
	do {	
		bajty = fread(temp, sizeof(char), bufer, plik1 );
		fwrite(temp, sizeof(char), bajty, plik2);
	} while(bajty > 0);
	 if (ferror(plik1) != 0 || ferror(plik2) != 0) {
       exit(EXIT_FAILURE);
	}
	exit(EXIT_SUCCESS);
}