[C++]Program wczytujący dane z dwóch plików do jednej tablicy

0

Witam, mam problem z programem wczytującym dane z dwóch plików do jednej tablicy(char).Chodzi o to, żeby program wczytywał liczby z dwóch programów do jednej tablicy. Napisałem taki oto kod, niestety nie działa on poprawnie:

 
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
int length;
int length_2;
fstream plik( "dane9.txt", ios::in ); 
fstream plik_2( "dane10.txt", ios::in );
char bufor[ 1024 ];
char bufor_2[ 1024 ];
int main(){
plik.read( bufor, 1024 );
plik_2.read(bufor_2, 1024); 
length = strlen(bufor);
length_2 = strlen(bufor_2);
for (int i = 0 ;i<length_2;i++)
{
    length = length + 1;
    bufor[length] = bufor_2[i];
}
cout<<bufor<<endl;
system("pause");
return 0;
}
0

Strasznie kombinujesz. Przy odczycie pierwszego pliku podaj jako cel bufor (czyli jego początek). Przy drugim odczycie jako cel podaj ten sam bufor, ale jako wskaźnik przesunięty o ilość elementów (bajtów) wczytanych z pierwszego pliku. Pamiętaj żeby sprawdzać czy przypadkiem nie wyjeżdżasz poza tablicę. Nie potrzebujesz do tego pętli.

0
plik.read(bufor, 1024 );
plik_2.read(& bufor[?], 1024); 
 

Nie jestem pewien co mam wstawić

0

Nie powinienem Ci tego wykładać jak kawę na ławę, ale co tam. Dla utrudnienia kod jest w C (bo ja C++ nie czaję, sorry).

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define BUFSIZE    1024

int main(void) {
        char		buffer[BUFSIZE];
        off_t		offset;
        int		fh;


        memset(buffer, '\0', BUFSIZE);
        if ( (fh = open("dane1.txt", O_RDONLY)) == -1 ) {
                perror("open1");
                return 1;
        };

        offset = read(fh, buffer, BUFSIZE);
        close(fh);

        if ( offset == BUFFSIZE ) {
               fprintf(stderr, "No room for data from dane2.txt\n");
               return 2;
        };

        if ( (fh = open("dane2.txt", O_RDONLY)) == -1 ) {
                perror("open2");
                return 3;
        };

        read(fh, buffer + offset, BUFSIZE - offset);
        close(fh);

        fprintf(stdout, "Dane: %s\n", buffer);
        return 0;
};
[beorn@nika tmp]$ echo -n "Ala ma kota" > dane1.txt 
[beorn@nika tmp]$ echo -n " a kot ma Alę" > dane2.txt 
[beorn@nika tmp]$ ./test
Dane: Ala ma kota a kot ma Alę

EDIT: Zrobiłem to "ładniej"...

0

Dziękuję bardzo za fragment kodu i wkład pracy program już działa.

0

Jest jeszcze jeden problem, mianowicie chce aby ten program przepisał tą tablicę(char) na tablicę liczb(int).

0

Musisz być bardziej specyficzny. Czy dane w pliku są znakowymi reprezentacjami liczb (np. "106"), czy są binarne. Czy dane są cyframi (jeden znak) czy liczbami (wiele znaków) itd. itp.

0

W tablicy znajdują się liczby wczytane jako znaki (char)
EDIT:chodzi o tablicę "bufor"

0

Jeśli są to liczby, to w takim razie muszą one być oddzielone jakimś separatorem (np. spacją, tabulacją, przecinkiem, znakiem nowej linii, ...). W takim razie musisz najpierw te dane przeparsować. Reprezentację znakową liczby zamienisz na liczbę np. funkcją strtol(), strtoll() czy strtod(). Zastanów się także czy chcesz parsować dane z bufora znakowego po wczytaniu z pliku, czy parsować w momencie odczytu i zapisywać już przekonwertowane wartości. Krótko mówiąc, najpierw musisz przemyśleć program.

0

Chce parsować dane po wczytaniu do ostatecznej postaci tablicy 'bufor' , ale przed wysłaniem tej tablicy do pliku wyjściowego. Mam taki kod, ale mam problem z użyciem funkcji strtol(), gdyż nie moge za jej pomocą przepisać tablicy na tablice int-ów:

 #include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
int length;
int length_2;
int offset;
//int liczba;
//char *pEnd;
ifstream plik( "dane9.txt"); 
ifstream plik_2( "dane10.txt");
ofstream plik_3("dane11.txt");
char bufor[ 1024 ];
int main(){
    plik.read(bufor , 1024 );
    offset = strlen(bufor) ;
    plik_2.read( (bufor + offset), (1024 - offset)); 
    //for (int i=0;i<offset;i++)
    // {
    //  liczba = strtol(bufor, &pEnd, 10);
    //}
    //cout<<liczba;
    plik_3<<bufor;
    system("pause");
return 0;
}
0

Po pierwsze offset przechowuje liczbę elementów (bajtów) odczytanych z pierwszego pliku, a Ty próbujesz jej użyć jako zmiennej przechowującej ilość wszystkich wczytanych elementów.
Po drugie funkcje strto*() nie przelecą Ci całego bufora i nie porozdzielają za Ciebie poszczególnych ciągów. Musisz najpierw zawartość bufora rozbić na mniejsze ciągi zawierające te liczby i nimi karmić funkcje.

0

Tak, tylko nie wiem jak rozbić "bufor" na ciągi.

0

Aaa faktycznie przepraszam za głupie pytanie, zapomniałem o tej funkcji

0

Mam już program porozbijany na ciągi pojedynczych liczb, ale nie rozumiem do końca funkcji strtol()

long int strtol ( const char * str, char ** endptr, int base ); 

Nie rozumiem o co chodzi z "int base"

0

Base to jest podstawa. Np:

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


int main(void) {
        fprintf(stdout, "Podstawa 10: %d\n", strtol("1234", NULL, 10));
        fprintf(stdout, "Podstawa 16: %d\n", strtol("0A", NULL, 16));
        fprintf(stdout, "Podstawa 8: %d\n", strtol("003", NULL, 8));
        return 0;
};

Na wyjściu masz:

[beorn@nika tmp]$ ./test
Podstawa 10: 1234
Podstawa 16: 10
Podstawa 8: 3

W Twoim przypadku zapewne chcesz mieć podstawę 10.

0

base to jest podstawa. W przypadku systemu dziesiętnego to jest 10, dwójkowego 2, itp. itd.

0
byku_guzio napisał(a)

base to jest podstawa. W przypadku systemu dziesiętnego to jest 10, dwójkowego 2, itp. itd.

Ta odpowiedź zdaje się bardziej dosadna i do mnie przemówiła, ale mam problem z wczytaniem na zmienną typu int tego rozdzielonego "ciągu". Napisałem to tak:

liczba = strtol(pch, &pEnd, 10); 

liczba - zmienna typu int
pch - mały ciąg char rozdzielony za pomocą funkcji strtok()
pEnd - tablica char zadeklarowana w ten sposób:

 char * pEnd;

Program się zawiesza...

0

To zamiast &pEnd wrzuć NULL i nie powinno być problemów. Albo w ogóle użyj atoi/atol zamiast strtol.

0
byku_guzio napisał(a)

To zamiast &pEnd wrzuć NULL i nie powinno być problemów. Albo w ogóle użyj atoi/atol zamiast strtol.

Dokładnie tak zrobiłem - użyłem atoi() :D i to zanim jeszcze wrzuciłeś tego posta. Wszystko chodzi. Dziękuje za pomoc.

0

Uwaga! Wycinek z manuala funkcji atoi(): The atoi() function has been deprecated by strtol() and should not be used in new code.

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