<font size="2">Mam do napisania program, który będzie kopiował zawartość danego pliku tekstowego do innego pliku tekstowego.</span>
W tym celu kolejno:
- otwieram plik;
- zliczam ilość znaków w pliku;
- alokuję odpowiednią ilość pamięci (tablicę znaków o odpowiedniej długości);
- czytam plik znak po znaku i zapisuje kolejne znaki do tablicy;
- tworze nowy plik;
- przepisuje kolejno znak po znaku wszystkie znaki z tablicy do nowego pliku.
Problem jest w tym, że dla niektórych plików ten algorytm działa, a dla niektórych nie.
Podejrzewam, że pliki, dla których algorytm nie działa są zakodowane w UNICODE.
Po czym poznać, czy plik zapisuje znaki na 8, czy na 16 bitach i jak obsłużyć ten drugi sposób zapisu?
Oto program, który działa dla plików zapisanych w ASCII:
#include <iostream>
#include <string>
#include <conio.h>
#include <stdlib.h>
#include <fstream>
#include <stdio.h>
using namespace std;
int main()
{
char* napis;
char nazwa[256];
int l = 0;
fstream plik, plik1, plik2;
cout << "Podaj nazwe pliku: ";
cin >> nazwa;
plik1.open(nazwa, ios::in);
/* obliczam ilosc znakow w pliku */
while(plik1.eof() == 0)
{
plik1.get();
l++;
}
plik1.close();
/* alokuje odpowiednio dluga tablice znakow */
napis = new char[l];
cout << "Plik zawiera " << l << " znakow." << endl;
l = 0;
plik.open(nazwa, ios::in);
/* zczytuje wszystkie znaki do tablicy */
while(plik.eof() == 0)
{
plik.get(napis[l]);
l++;
}
plik.close ();
/* tworze nowa nazwe pliku */
strcat(nazwa, "_new.txt");
/* zapisuje zawartosc tablicy do nowego pliku */
plik2.open(nazwa, ios::out);
for(int i = 0; i < l-1; i++)
{
plik2.put(napis[i]);
}
plik2.close();
getch();
return 0;
}
Pliki testowe:
Dla tego pliku program działa:http://free.of.pl/s/szachysta/plik1.txt
Dla tego pliku program nie działa:http://free.of.pl/s/szachysta/plik2.txt
Problem polega na tym, że muszę napisać program, który powinien obsłużyć wszystkie możliwe formaty plików tekstowych,
czyli program sam musi sprawdzać jak plik jest zapisany i obsłużyć go w odpowiedni sposób.
Proszę o pomoc, bo bez rozwiązania tego problemu nie mogę ruszyć dalej z pisaniem programu, którego ten problem jest niestety częścią...
--
Szach