Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

c++ łączenie programów

Ostatnio zmodyfikowano 2025-06-04 00:36
Autor Wiadomość
Zaba...
Temat założony przez niniejszego użytkownika
c++ łączenie programów
» 2013-02-23 13:42:21
Witam, niedawno zacząłem zabawę z c++ (używam code::Blocks) i proszę o pomoc bardziej zaawansowanych użytkowników/forumowiczów w takiej kwestii:

mam 4 programy i chciałbym się dowiedzieć jak można je połączyć (czy jest taka możliwosć) jakich komend/skryptów użyć.
Mówiąc wprost, po prostu jak mam to napisać, co i gdzie mam zrobić aby działało i spełniało swoją funkcję.
Z góry dzięki za zainteresowanie.
Poniżej zamieszczam te programy:

1. Zapis do pliku tekstowego
C/C++
#include<stdio.h>
#include<conio.h>

int main()
{
    FILE * out;
    float pi = 3.1415;
    int i = 100;
    char znak = 'A';
   
    // otwarcie pliku tekstowego do zapisu
    if(( out = fopen( "plik tekstowy.txt", "wt" ) ) == NULL )
    {
        fprintf( stderr, "Nie mozna otworzyc pliku.\n" );
        return 1;
    }
   
    // fprintf - zapis do pliku out
    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 );
   
    // zamkniecie pliku
    fclose( out );
    printf( "\nDane zostaly zapisane do pliku plik tekstowy.txt" );
    getch();
    return 0;
}

2. Odczyt z pliku tekstowego

 
C/C++
#include<stdio.h>
#include<conio.h>
int main()

{
    FILE * in;
    char bufor[ 512 ];
   
    // otwarcie pliku tekstowego do odczytu: rt
    if(( in = fopen( "plik tekstowy.txt", "rt" ) ) == NULL )
    {
        fprintf( stderr, "\nBlad otwarcia pliku dyskowego!\n" );
        return 1;
    }
    printf( "\n zawartosc pliku: plik tekstowy.txt\n" );
   
    // odczyt z pliku
    while( feof( in ) == 0 ) // (koniec pliku)
    {
        fgets( bufor, 512, in ); // odczyt jednej linii tekstu
        printf( "%s", bufor );
    }
   
    // zamkniecie pliku
    fclose( in );
    getch();
    return 0;
}



3. Zapis do pliku binarnego
C/C++
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //memset

// definicja struktury osoba
typedef struct {
    char imie[ 25 ];
    char nazwisko[ 25 ];
    int wiek;
} osoba;

int main()
{
    FILE * plik;
    int n, i;
    osoba ludzie[ 100 ];
   
    memset( ludzie, 0, sizeof( ludzie ) ); // czyszczenie tablicy ludzie
   
    printf( "Zapisywanie rekordow do pliku\n\r" );
    printf( "Ile rekordow chcesz zapisac ? :\n" );
    scanf( "%i", & n );
   
    // otwarcie pliku do zapisu - handler: uchwyt pliku
    if(( plik = fopen( "records.dat", "wb" ) ) == NULL )
    {
        printf( "Blad otwarcia pliku\n" );
        return 1;
    }
    // ustawienie pozycji w pliku na poczatek
    fseek( plik, 0L, SEEK_SET );
   
    for( i = 1; 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 );
       
        // zapis jednego rekordu do pliku
        fwrite( & ludzie[ i ], sizeof( osoba ), 1, plik );
    }
   
    fclose( plik );
    system( "pause" );
    return 0;
}


4. Odczyt z pliku binarnego:

C/C++
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// definicja struktury osoba
typedef struct {
    char imie[ 25 ];
    char nazwisko[ 25 ];
    int wiek;
} osoba;

int main()
{
    FILE * plik;
    int n, licznik =- 1;
    osoba ludzie[ 100 ];
    printf( "\n\rProgram odczytuje liste rekordow z pliku records.dat\n\r" );
    memset( ludzie, 0, sizeof( ludzie ) ); // czyszczenie tablicy ludzie
   
    // otwarcie pliku do odczytu - plik: uchwyt pliku
    if(( plik = fopen( "records.dat", "rb" ) ) == NULL )
    {
        printf( "Blad otwarcia pliku\n" );
        return 1;
    }
   
    // ustawienie pozycji w pliku na poczatek
    fseek( plik, 0L, SEEK_SET );
    // odczyt kolejnych rekordow
    while( 1 )
    {
        licznik++;
        // odczyt jednego rekordu
        fread( & ludzie[ licznik ], sizeof( osoba ), 1, plik );
       
        if( feof( plik ) ) break; // wyjscie z petli jezeli koniec pliku
       
        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" );
    return 0;
}
P-76784
Kopczak1995
» 2013-02-23 13:50:37
Najprościej jak to można zrobić:
W głównym programie czyli najczęściej main.cpp musisz dołączyć pozostałe pliki. Działa to podobnie jak w przypadku dodawania zwykłych bibliotek z tą różnicą, że zamiast <> używasz cudzysłowów "plik.cpp". Czyli przykładowo:
C/C++
//plik main.cpp
#include "plik1.cpp"
#include "plik2.cpp"
#include "plik3.cpp"
#include "... itd"

int main()
{
    //to co tam robisz
}
Jeżeli chcesz aby plik znajdował się w innym folderze to nikt nie broni ci tego zrobić ale pamiętaj aby poprawną ścieżkę ustawić. Przykładowo:
C/C++
//plik main.cpp
#include "inny_folder/plik1.cpp"

int main()
{
    //to co tam robisz
}
P-76785
megatron
» 2013-02-23 14:18:43
najłatwiej to by zrobić menu wyboru switch i case
albo if i else
jak byś chciał połączyć sposobem takim jak zaproponował Kopczak1995 to byś musiał się trochę nabawić, ponieważ możesz mieć tylko jedno
 
int main()
P-76788
Kopczak1995
» 2013-02-23 14:24:50
@Up
Zawsze poszczególne "mainy" można potraktować jako zwykłe funkcje - kto mu broni :)
P-76790
Zaba...
Temat założony przez niniejszego użytkownika
Dzięki Panowie!
» 2013-02-23 14:31:16
spróbuje narazie sposobem megatrona skoro jest to łatwiejsze podejscie. Jak się uda to poinformuję.
Mile widziane będą kolejne sugestie jak to powiązać aby zadziałało.
P-76794
Krzysiek318k
» 2013-02-23 16:13:25
Tu masz profesjonalne rozwiązanie:
» Kurs C++Dzielenie kodu na kilka plików źródłowych lekcja
P-76799
termistor
» 2025-06-04 00:36:33
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 ulepszenia

1. 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.
P-182483
« 1 »
  Strona 1 z 1