Witaj Zaba,Zdaję sobie sprawę, że masz już gotowe programy, a teraz chcesz je połączyć w jedno narzędzie z menu wyboru. Oto propozycja, jak to zrobić:
1.
Zamień każdą funkcję main na osobną funkcję2.
Stwórz menu wyboru (np. za pomocą switch/case)
3.
Połączone funkcje będą się wywoływały zgodnie z wyborem użytkownika
[br]
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
// Struktura osoba - potrzebna do zapisu/odczytu z pliku binarnego
typedef struct {
char imie[25];
char nazwisko[25];
int wiek;
} osoba;
// Funkcja 1: Zapis do pliku tekstowego
void zapiszDoTekstowego() {
FILE *out;
float pi = 3.1415;
int i = 100;
char znak = 'A';
if ((out = fopen("plik tekstowy.txt", "wt")) == NULL) {
fprintf(stderr, "Nie mozna otworzyc pliku.\n");
return;
}
fprintf(out, "\n Raport z programu\n\n");
fprintf(out, "Wydruk zmiennej typu float pi = %6.4f \n", pi);
fprintf(out, "Wydruk zmiennej typu int i = %3i \n", i);
fprintf(out, "Wydruk zmiennej typu char znak = %c \n", znak);
fclose(out);
printf("\nDane zostaly zapisane do pliku plik tekstowy.txt");
getch();
}
// Funkcja 2: Odczyt z pliku tekstowego
void odczytajZTekstowego() {
FILE *in;
char bufor[512];
if ((in = fopen("plik tekstowy.txt", "rt")) == NULL) {
fprintf(stderr, "\nBlad otwarcia pliku dyskowego!\n");
return;
}
printf("\n zawartosc pliku: plik tekstowy.txt\n");
while (feof(in) == 0) {
fgets(bufor, 512, in);
printf("%s", bufor);
}
fclose(in);
getch();
}
// Funkcja 3: Zapis do pliku binarnego
void zapiszDoBinarnego() {
FILE *plik;
int n, i;
osoba ludzie[100];
printf("Zapisywanie rekordow do pliku\n\r");
printf("Ile rekordow chcesz zapisac ? :\n");
scanf("%i", &n);
if ((plik = fopen("records.dat", "wb")) == NULL) {
printf("Blad otwarcia pliku\n");
return;
}
fseek(plik, 0L, SEEK_SET);
for (i = 0; i < n; i++) {
printf("\n Imie:");
scanf("%s", ludzie[i].imie);
printf(" Nazwisko:");
scanf("%s", ludzie[i].nazwisko);
printf(" Wiek:");
scanf("%i", &ludzie[i].wiek);
fwrite(&ludzie[i], sizeof(osoba), 1, plik);
}
fclose(plik);
system("pause");
}
// Funkcja 4: Odczyt z pliku binarnego
void odczytajZBinarnego() {
FILE *plik;
int n, licznik = -1;
osoba ludzie[100];
printf("\n\rProgram odczytuje liste rekordow z pliku records.dat\n\r");
if ((plik = fopen("records.dat", "rb")) == NULL) {
printf("Blad otwarcia pliku\n");
return;
}
fseek(plik, 0L, SEEK_SET);
while (1) {
licznik++;
fread(&ludzie[licznik], sizeof(osoba), 1, plik);
if (feof(plik)) break;
printf("\n\r Nr rekordu:%i\n\r", licznik);
printf(" Imie: %s\n\r", ludzie[licznik].imie);
printf(" Nazwisko: %s\n\r", ludzie[licznik].nazwisko);
printf(" Wiek: %i\n\r", ludzie[licznik].wiek);
}
printf("\n\rOdczytano %i rekord(y)ow\n\r", licznik);
fclose(plik);
system("pause");
}
// Funkcja głowna z menu
int main() {
int wybor;
while (1) {
system("cls"); // Czyszczenie ekranu (dla Windows)
printf("[1] Zapis do pliku tekstowego\n");
printf("[2] Odczyt z pliku tekstowego\n");
printf("[3] Zapis do pliku binarnego\n");
printf("[4] Odczyt z pliku binarnego\n");
printf("[5] Wyjscie\n");
printf("Wybor: ");
scanf("%i", &wybor);
switch(wybor) {
case 1: zapiszDoTekstowego(); break;
case 2: odczytajZTekstowego(); break;
case 3: zapiszDoBinarnego(); break;
case 4: odczytajZBinarnego(); break;
case 5: return 0;
default: printf("Niepoprawny wybor!\n"); getch();
}
}
return 0;
}
[br]
Uwagi dotyczące kodu:1.
Funkcje main zostały zamienione na funkcje zapiszDoTekstowego, odczytajZTekstowego, itd.
2.
Menu pozwala użytkownikowi wybrać, który program chce uruchomić
3.
system("cls") służy do czyszczenia ekranu (dla Windows, jeśli chcesz to pod Linuxem użyj system("clear"))
4.
Funkcje zostały pozostawione w oryginalnej formie, z kilkoma drobnymi poprawkami
[br]
Rozszerzenia i ulepszenia1. Możesz dodać walidację danych wejściowych
2. Można zaimplementować zapis i odczyt bez restartu programu
3. Można dodać opcję zapisu do innych plików
4. Można rozszerzyć menu o dodatkowe funkcje
Jeśli masz pytania do konkretnych fragmentów kodu, chętnie pomogę z wyjaśnieniem.