dublowany ostatni znak

0

Hejo, napisalem cos co ma kopiowac z jednego pliku do drugiego:

#include<iostream>
int main() {
	string a;
	cout << "Z: ";
	cin >> a;
	ifstream z_pliku;
	z_pliku.open(a, ios_base::binary | ios_base::in);
	if (!z_pliku.is_open()) {
		cout << "nie mozna otworzyc";
		exit(EXIT_FAILURE);
	}
	cout << "Do: ";
	cin >> a;
	ofstream do_pliku;
	do_pliku.open(a, ios_base::binary | ios_base::out);
	if (!z_pliku.is_open()) {
		cout << "nie mozna otworzyc";
		exit(EXIT_FAILURE);
	}

	char x;
	while (!z_pliku.eof()) {
		z_pliku.read((char*)&x, 1);
		do_pliku.write((char*)&x, 1);
	}
	cout << "Juz\n";
	z_pliku.close();
	do_pliku.close();
	
	return 0;
}

najbardziej nie podoba mi sie petla, ktora zastosowalem ale nie mialem lepszego pomyslu. problem jest w tym ze program zawsze kopiuje ostatni znak dwukrotnie, dlaczego?

2

while (!z_pliku.eof()) { tu jest błąd. Flaga eof jest utawiana dopiero kiedy próbujesz czytać będąc na końcu pliku a nie kiedy dochodzisz do końca pliku. W efekcie pętla wykona sie 1 raz więcej niż ci sie wydaje.

0

A jakies madrzejsze rozwiazanie niz:

z_pliku.read((char*)&x, 1);
	while (!z_pliku.eof()) {
		do_pliku.write((char*)&x, 1);
		z_pliku.read((char*)&x, 1);
	}

?

2

@Craith nie ma sensu czytac i zapisywac po znaku
uzyj do tego getline

ifstream in("document1.txt");
ofstream out("document2.txt");
string str;
while(getline(in,str))
{
    out<<str;
}
0

@fasadin biorąc pod uwagę, że to plik binarny - nienajlepszy pomysł, ale wskazałeś kierunek właściwy - czytanie większymi buforami :) Choć przy strumieniach, nie wiem, czy bedzie aż takie przyspieszenie, jakbyśmy się tego spodziewali.

1
char buffer[0x100];
while (z_pliku.read(buffer, sizeof(buffer)).gcount()>0) {
    do_pliku.write(buffer, z_pliku.gcount());
}
0

Miałem taki sam problem, chciałem pobierać po znaku i działać na poszczególnych bajtach i nie mogłem użyć getline(). Więc rozwiązałem to w taki sposób:


   char bajt;
   while(plik.good())
   {
       plik.read((char*)& bajt, sizeof bajt);
       if (plik.eof()) break;
  }
 

Nie jestem pewny, czy to aby poprawna forma , ale działa póki co bez zarzutu ;)

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