-
1. Data: 2010-04-13 14:12:30
Temat: Operacje na plikach (odczyt i zapis fread i fwrite)
Od: "Marcin M." <m...@g...com>
Witam!
Bardzo bym prosił o pomoc. Dlaczego to nie działa choć się kompiluje?
Nie jestem zbyt dobrym programistom, potrzebny mi po prostu program do
szkoły. Radzę sobie z odczytywaniem plików ale nie mogę dopisywać do
pliku żadnych danych ani nic w nim zmieniać. Nie mogę nawet po prostu
przekopiować zawartości tego pliku:
int przepisz (char *path1, char *path2)
{
FILE* zrodlo;
FILE* target;
zrodlo = fopen(path1,"rb");
target = fopen(path2,"wb");
rewind(zrodlo);
fseek(zrodlo,0,SEEK_END);
size_t p1size=ftell(zrodlo);
rewind(target);
rewind(zrodlo);
char* bufer;
bufer=0;
fread(bufer,p1size,1,zrodlo);
fwrite(bufer,p1size,1,target);
fclose(zrodlo);
fclose(target);
return 0;
}
void main(void)
{
//przepisz("obraz3.bmp","przepisany.bmp");
}
-
2. Data: 2010-04-13 14:28:19
Temat: Re: Operacje na plikach (odczyt i zapis fread i fwrite)
Od: Jacek Czerwinski <...@...z.pl>
Marcin M. pisze:
> Witam!
> Bardzo bym prosił o pomoc. Dlaczego to nie działa choć się kompiluje?
Porobisz trochę w C, zobaczysz że kompilacja nie znaczy niemal nic.
Ze słowem 'nie działa' to masz małe szanse dostać pomoc. Podawaj objawy,
komunikaty, te sprawy. Wybacz, ale 'nie działa' to każda blondynka napisze.
> Nie jestem zbyt dobrym programistom,
polonistą też. Wybacz, sam się podkładasz.
> potrzebny mi po prostu program do
> szkoły. Radzę sobie z odczytywaniem plików ale nie mogę dopisywać do
> pliku żadnych danych ani nic w nim zmieniać. Nie mogę nawet po prostu
> przekopiować zawartości tego pliku:
Po pierwsze wyniki działania funkcji np. fopen trzeba sprawdzać, jak nie
gra, to sprawdzac dlaczego (errno, perror)
Po drugie czytasz pod nieistniejący (niezainicjowany prawidłowo - skąd
to rżnąłeś?) bufer.
-
3. Data: 2010-04-13 14:35:51
Temat: Re: Operacje na plikach (odczyt i zapis fread i fwrite)
Od: Mariusz Kruk <M...@e...eu.org>
epsilon$ while read LINE; do echo \>"$LINE"; done < "Marcin M."
> fseek(zrodlo,0,SEEK_END);
> size_t p1size=ftell(zrodlo);
> fread(bufer,p1size,1,zrodlo);
A poza rzeczami, które już ci koledzy napisali, jesteś bardzo odważny
usiłując wczytać cały plik na raz.
--
\------------------------/
| K...@e...eu.org |
| http://epsilon.eu.org/ |
/------------------------\
-
4. Data: 2010-04-13 14:39:50
Temat: Re: Operacje na plikach (odczyt i zapis fread i fwrite)
Od: Marcin Kwiatkowski <f...@l...bielsko.pl>
On 2010-04-13, Marcin M. <m...@g...com> wrote:
> Witam!
> Bardzo bym prosił o pomoc. Dlaczego to nie działa choć się kompiluje?
> Nie jestem zbyt dobrym programistom, potrzebny mi po prostu program do
> szkoły. Radzę sobie z odczytywaniem plików ale nie mogę dopisywać do
> pliku żadnych danych ani nic w nim zmieniać. Nie mogę nawet po prostu
> przekopiować zawartości tego pliku:
>
>
>
>
> int przepisz (char *path1, char *path2)
> {
> FILE* zrodlo;
> FILE* target;
>
> zrodlo = fopen(path1,"rb");
> target = fopen(path2,"wb");
> rewind(zrodlo);
> fseek(zrodlo,0,SEEK_END);
> size_t p1size=ftell(zrodlo);
>
> rewind(target);
> rewind(zrodlo);
> char* bufer;
> bufer=0;
Niepotrzebne. zamiast tego
bufer=malloc(p1size);
> fread(bufer,p1size,1,zrodlo);
> fwrite(bufer,p1size,1,target);
> fclose(zrodlo);
> fclose(target);
a tu
free(bufer);
> return 0;
> }
>
>
>
> void main(void)
> {
> //przepisz("obraz3.bmp","przepisany.bmp");
> }
--
Pozdrawiam,
Marcin Kwiatkowski
-
5. Data: 2010-04-13 14:41:51
Temat: Re: Operacje na plikach (odczyt i zapis fread i fwrite)
Od: Marcin Kwiatkowski <f...@l...bielsko.pl>
On 2010-04-13, Marcin Kwiatkowski <f...@l...bielsko.pl> wrote:
> On 2010-04-13, Marcin M. <m...@g...com> wrote:
>> Witam!
>> Bardzo bym prosił o pomoc. Dlaczego to nie działa choć się kompiluje?
>> Nie jestem zbyt dobrym programistom, potrzebny mi po prostu program do
>> szkoły. Radzę sobie z odczytywaniem plików ale nie mogę dopisywać do
>> pliku żadnych danych ani nic w nim zmieniać. Nie mogę nawet po prostu
>> przekopiować zawartości tego pliku:
>>
>>
>>
>>
>> int przepisz (char *path1, char *path2)
>> {
>> FILE* zrodlo;
>> FILE* target;
>>
>> zrodlo = fopen(path1,"rb");
>> target = fopen(path2,"wb");
>> rewind(zrodlo);
>> fseek(zrodlo,0,SEEK_END);
>> size_t p1size=ftell(zrodlo);
>>
>> rewind(target);
>> rewind(zrodlo);
>> char* bufer;
>> bufer=0;
> Niepotrzebne. zamiast tego
> bufer=malloc(p1size);
>
>> fread(bufer,p1size,1,zrodlo);
>> fwrite(bufer,p1size,1,target);
>> fclose(zrodlo);
>> fclose(target);
> a tu
> free(bufer);
>> return 0;
>> }
>>
>>
>>
>> void main(void)
>> {
>> //przepisz("obraz3.bmp","przepisany.bmp");
>> }
>
>
Ach... pospieszylem sie i niewyraznie napisalem :)
oczywiscie niepotrzebnie zerujesz wskaznik. A przed opuszczeniem funkcji
musisz zwolnic pamiec.
--
Pozdrawiam,
Marcin Kwiatkowski
-
6. Data: 2010-04-13 16:06:45
Temat: Re: Operacje na plikach (odczyt i zapis fread i fwrite)
Od: "Marcin M." <m...@g...com>
Dzięki, teraz działa. Niestety kłóci się z resztą programu. (Po
uruchomieniu dostaję komunikat "Przepraszamy, wystąpił problem z
aplikacją Bitmapy.exe i zostanie ona zamknięta..." - dlaczego?).
Wywołując TYLKO funkcje LoadData i LoadImage wszystko chodzi pięknie.
Co do błędu ortograficznego - zauważyłem go po wrzuceniu posta a nie
znalazłem opcji edytuj - przepraszam za urażenie Waszych zmysłów
estetycznych : )
Wczytuję cały plik bo są to niewielkie pliki (8x8), poza tym staram
się tylko przetestować operacje na plikach i zrozumieć dobrze jak
poprawnie używać fread i fwrite.
Oto reszta:
#include<iostream>
#include<fstream>
#include <Windows.h>
using namespace std;
class BMP
{
public:
typedef struct
{
WORD bfType;
DWORD bfSize;
DWORD bfReserved1;
DWORD bfReserved2;
DWORD bfOffBits;
} bmpFH;
typedef struct
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} bmpIH;
typedef struct
{
int R;
int G;
int B;
int empty;
} colors;
bmpFH FileHeader;
bmpIH InfoHeader;
colors IMGData;
unsigned char *Data;
};
int x,y;
char *buff;
long DSize;
int *binary;
FILE* plik;
FILE* data;
int LoadImage(char *sciezka)
{
BMP BM;
plik = fopen(sciezka, "rb");
fread(&BM.FileHeader, sizeof(BMP::bmpFH), 1, plik);
fread(&BM.InfoHeader, sizeof(BMP::bmpIH), 1, plik);
if (BM.FileHeader.bfType != 0x4D42)
{
printf("UWAGA: To nie jest bitmapa\n");
fclose(plik);
return 1;
}
fseek(plik, 18, SEEK_SET);
fread(&x, sizeof(LONG), 1, plik);
fread(&y, sizeof(LONG), 1, plik);
cout<<"Rozmiar obrazu (XxY) to: "<<x<<"x"<<y<<endl;
cout<<"Maksymalny rozmiar przechowywanych informacji: "<<((x-(x
%4))*y*3)<<" bitow"<<endl;
}
int LoadData(char *sciezka)
{
data = fopen(sciezka, "rb");
fseek(data,0,SEEK_END);
DSize= ftell(data)*8;
if (DSize>((x-(x%4))*y*3))
{
printf("UWAGA: Rozmiar pliku zbyt duzy\n");
fclose(data);
return 1;
}
cout<<"Aktualny rozmiar pliku z danymi: "<<DSize<<endl;
fseek(data,0,SEEK_SET);
char*buff;
buff=(char*)malloc(sizeof(char)*(DSize/8));
fread(buff,1,(DSize/8),data);
binary = new int[DSize];
int i,j;
i=0;
j=0;
for (i=0; i<=DSize; i=i+8)
{
j=0;
for(unsigned m = 128; m > 0; m >>= 1)
{
if(buff[i/8] & m)
{binary[i+j]=1; }
else
{binary[i+j]=0; }
j++;
}
} fclose(data);
free(buff);
}
int przepisz (char *path1, char *path2)
{
FILE* zrodlo;
FILE* target;
zrodlo = fopen(path1,"rb");
target = fopen(path2,"wb");
rewind(zrodlo);
fseek(zrodlo,0,SEEK_END);
size_t p1size=ftell(zrodlo);
rewind(target);
rewind(zrodlo);
void*bufer;
bufer=malloc(p1size);
fread(bufer,p1size,1,zrodlo);
fwrite(bufer,p1size,1,target);
fclose(zrodlo);
fclose(target);
free(bufer);
return 0;
}
void main(void)
{
LoadImage("obraz3.bmp");
LoadData("dane.dnn");
//przepisz("obraz3.bmp","przepisany.bmp");
}
-
7. Data: 2010-04-13 16:06:58
Temat: Re: Operacje na plikach (odczyt i zapis fread i fwrite)
Od: "Marcin M." <m...@g...com>
Dzięki, teraz działa. Niestety kłóci się z resztą programu. (Po
uruchomieniu dostaję komunikat "Przepraszamy, wystąpił problem z
aplikacją Bitmapy.exe i zostanie ona zamknięta..." - dlaczego?).
Wywołując TYLKO funkcje LoadData i LoadImage wszystko chodzi pięknie.
Co do błędu ortograficznego - zauważyłem go po wrzuceniu posta a nie
znalazłem opcji edytuj - przepraszam za urażenie Waszych zmysłów
estetycznych : )
Wczytuję cały plik bo są to niewielkie pliki (8x8), poza tym staram
się tylko przetestować operacje na plikach i zrozumieć dobrze jak
poprawnie używać fread i fwrite.
Oto reszta:
#include<iostream>
#include<fstream>
#include <Windows.h>
using namespace std;
class BMP
{
public:
typedef struct
{
WORD bfType;
DWORD bfSize;
DWORD bfReserved1;
DWORD bfReserved2;
DWORD bfOffBits;
} bmpFH;
typedef struct
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} bmpIH;
typedef struct
{
int R;
int G;
int B;
int empty;
} colors;
bmpFH FileHeader;
bmpIH InfoHeader;
colors IMGData;
unsigned char *Data;
};
int x,y;
char *buff;
long DSize;
int *binary;
FILE* plik;
FILE* data;
int LoadImage(char *sciezka)
{
BMP BM;
plik = fopen(sciezka, "rb");
fread(&BM.FileHeader, sizeof(BMP::bmpFH), 1, plik);
fread(&BM.InfoHeader, sizeof(BMP::bmpIH), 1, plik);
if (BM.FileHeader.bfType != 0x4D42)
{
printf("UWAGA: To nie jest bitmapa\n");
fclose(plik);
return 1;
}
fseek(plik, 18, SEEK_SET);
fread(&x, sizeof(LONG), 1, plik);
fread(&y, sizeof(LONG), 1, plik);
cout<<"Rozmiar obrazu (XxY) to: "<<x<<"x"<<y<<endl;
cout<<"Maksymalny rozmiar przechowywanych informacji: "<<((x-(x
%4))*y*3)<<" bitow"<<endl;
}
int LoadData(char *sciezka)
{
data = fopen(sciezka, "rb");
fseek(data,0,SEEK_END);
DSize= ftell(data)*8;
if (DSize>((x-(x%4))*y*3))
{
printf("UWAGA: Rozmiar pliku zbyt duzy\n");
fclose(data);
return 1;
}
cout<<"Aktualny rozmiar pliku z danymi: "<<DSize<<endl;
fseek(data,0,SEEK_SET);
char*buff;
buff=(char*)malloc(sizeof(char)*(DSize/8));
fread(buff,1,(DSize/8),data);
binary = new int[DSize];
int i,j;
i=0;
j=0;
for (i=0; i<=DSize; i=i+8)
{
j=0;
for(unsigned m = 128; m > 0; m >>= 1)
{
if(buff[i/8] & m)
{binary[i+j]=1; }
else
{binary[i+j]=0; }
j++;
}
} fclose(data);
free(buff);
}
int przepisz (char *path1, char *path2)
{
FILE* zrodlo;
FILE* target;
zrodlo = fopen(path1,"rb");
target = fopen(path2,"wb");
rewind(zrodlo);
fseek(zrodlo,0,SEEK_END);
size_t p1size=ftell(zrodlo);
rewind(target);
rewind(zrodlo);
void*bufer;
bufer=malloc(p1size);
fread(bufer,p1size,1,zrodlo);
fwrite(bufer,p1size,1,target);
fclose(zrodlo);
fclose(target);
free(bufer);
return 0;
}
void main(void)
{
LoadImage("obraz3.bmp");
LoadData("dane.dnn");
//przepisz("obraz3.bmp","przepisany.bmp");
}
-
8. Data: 2010-04-13 18:55:11
Temat: Re: Operacje na plikach (odczyt i zapis fread i fwrite)
Od: Mariusz Kruk <M...@e...eu.org>
epsilon$ while read LINE; do echo \>"$LINE"; done < "Marcin M."
>Dzięki, teraz działa. Niestety kłóci się z resztą programu. (Po
>uruchomieniu dostaję komunikat "Przepraszamy, wystąpił problem z
>aplikacją Bitmapy.exe i zostanie ona zamknięta..." - dlaczego?).
Prawdopodobnie coś spaprałeś gdzie indziej.
>Wywołując TYLKO funkcje LoadData i LoadImage wszystko chodzi pięknie.
"Jeśli wywołuję", a nie "wywołując" (idąc do szkoły świeciło słońce).
>Wczytuję cały plik bo są to niewielkie pliki (8x8), poza tym staram
>się tylko przetestować operacje na plikach i zrozumieć dobrze jak
>poprawnie używać fread i fwrite.
Dobrze byłoby jakbyś zrozumiał dlaczego twoje podejście jest w ogólności
nienajlepsze (jak jesteś _absolutnie pewien_ warunków, czasami możesz
przyjąć pewne założenia, ale i tak pewnie kiedyś dostaniesz nimi po
głowie).
>Oto reszta:
Łojeza. Człowieku, zdecyduj się w czym piszesz.
C++ to _nie_ jest takie "fajniejsze C, bo można używać cout".
--
\.\.\.\.\.\.\.\.\.\.\.\.\.\
.\....@e...eu.org.\.\.
\.http://epsilon.eu.org/\.\
.\.\.\.\.\.\.\.\.\.\.\.\.\.
-
9. Data: 2010-04-13 22:01:12
Temat: Re: Operacje na plikach (odczyt i zapis fread i fwrite)
Od: gacek <g...@w...pl>
Marcin M. wrote:
> void main(void)
> {
> //przepisz("obraz3.bmp","przepisany.bmp");
> }
no dobra, ale tego to nikt nie widzi?
odkomentuj (skasuj //).
gacek