Dateigröße
-
@Peter Piksa
Du muesstest die Frage doch beantworten koennen!
1. Probier mal FindFirst (FindFirstFile o.ä.): Da wird im record Size geliefert!
oder : mit fseek(....) FilePointer der Datei ans Ende setzen und mit fgetpos(...) Position ermitteln! Schau mal in Hilfe ziu den Befehlen.2. Wenn Länge der Zeile gleich bleibt:
mit fseek(...) Filepointer auf 0 vom Anfang setzen, schreiben, fertig
Sonst:
die 1. Zeile in neue Datei schreiben
den Rest (Blockweise /zeilenweise aus Original lesen + in neue Datei schreiben, bis Inhalt komplett ist.
Am Ende Testen ob allse da ist und Original löschen.
Ev. neue Datei zurueckbenennen.
-
Ich probiers gleich mal aus danke
und die Zeile nicht immer die gleiche Länge.
und @ peter, hier die rache dat sind wir beim proggn *g
http://www.thedevilsclan.de/1.jpg
http://www.thedevilsclan.de/2.jpg
-
@DerAltebburger:
Die Frage habe ich ihm eben auch schon beantwortet mit dem folgendem Code:
void main() { float zaehler = 0; int shit; FILE * Dateizeiger; Dateizeiger=fopen("C:\\dateiname.bla","rb"); // Binär öffnen das ganze while(!feof(Dateizeiger)) // solange EndOfFile nicht erreicht ist { fscanf(Dateizeiger,"%c", &shit); // ein zeichen einlesen zaehler++; // und den zaehler um 1 erhöhen } fclose(Dateizeiger); printf("Dateigroesse in Bytes: %.2f", zaehler-1); // -1 weil das EnfOfFile noch drin ist. getch(); }
Das Problem bei dieser Methode ist dass sie sehr langsam werden kann wenn die File ein bissel grösser ist.
[ Dieser Beitrag wurde am 29.03.2003 um 21:20 Uhr von Peter Piksa editiert. ]
-
*Das Problem bei dieser Methode ist dass sie sehr langsam werden kann wenn die File ein bissel grösser ist.
Geau deshalb mit fseek(...) den filepointer an's ende setzen und testen wo der steht! geht ruckzuck!
-
i = fseek(fp, 128, SEEK_END);
Setz ich den FileCursor so 128 Byte vor oder nach das Dateiende?
-
warum postet ihr solche C Sachen ins C++ Forum?
-
@DerAltenburger:
Ok, Fabian und ich hams nun hinbekommen.
Allerdings haben wir uns mit deiner Lösung sehr schwer getan, das wollte einfach nicht laufen. Kannst du mir mal ein funktioierendes Beispielprogramm geben? (nur so dass man weiss wie mans sonst noch machen könnte)Hier das ist der Code mit dem ich die grösse in Byte ermittle:
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> void main() { struct _stat buf; int result; result = _stat( "C:\\Eminem Dr. Dre Black Rob And More-Summer 2000 Rap Mix.mp3", &buf ); if( result != 0 ) perror( "Problem getting information" ); else printf( "File size : %ld\n", buf.st_size ); }
-
[ Dieser Beitrag wurde am 30.03.2003 um 01:10 Uhr von Fabian Bernecker editiert. ]
-
Hallo,
es gibt keine wirklich portable Möglichkeit zur Bestimmung der Größe einer Datei. Weder in C noch in C++.Ein C++-Variante die auf "normalen" System funktioniert:
#include <fstream> using namespace std; int main() { ifstream inFile("bakaablssl.mp3", ios::binary); inFile.seekg(0, ios::end); unsigned long fileSize = std::streamoff(inFile.tellg()); inFile.seekg(0, ios::beg); }
In C verwendet man halt fseek und ftell.
#include <stdio.h> int main() { FILE* pFile = fopen("test.exe", "rb"); if (pFile) { fseek(pFile, 0, SEEK_END); long fileSize = ftell(pFile); fseek(pFile, 0, SEEK_SET); } }
-
*i = fseek(fp, 128, SEEK_END);
Setz ich den FileCursor so 128 Byte vor oder nach das Dateiende?
*Damit setzt Du den Pointer HINTER das Dateiende!!!
-> Es entsteht eine Lücke mit undefiniertem Inhalt!!! (oder je nach Compiler ein Fehler?)Setze NIE den Pointer vor den Anfang
Vermeide den Pointer hinter das Ende zu setzen!das Speibiel hat HumeSikkins schon geliefert!
@HumeSikkins
Am Ende sollte fclose(pFile) nicht fehlen!!!
-
Original erstellt von DerAltenburger:
**
Am Ende sollte fclose(pFile) nicht fehlen!!!**RAII geschädigt
(geschädigt?)
-
RAII ???
-
Ich denke er meint Red Alert 2 (C&C 4)
-
blubb
was ich meine ist Resource Acquisition Is Initialisation oder k.a. wie man das ausschreibt
mit fstreams muss hume die streams nicht schließen, weil das im destruktor passiert. das hat vorteile, denn wen eine ausnahme geworfen wird, wird automatisch der destruktor aufgerufen, fclose müsste man da dann aber manuell aufrufen.
damit wäre die gesamte exception safety im Ar***.
nach dem RAII-Prinzip wird im konstruktor alles angegeben (fstream file("bla") und nicht
fstream file; file.open("bla")) , und im destruktor automatisch vernichte´t
-
Ach sooooo
Mir gings um den C- Teil mit fopen()...., da sollte man das auch fclos()en.
Bei fstreams isses klar!
-
und ich hab gemeint, dass er nach (normalerweise) so viel RAII vergessen hat, das die C-Funktionen das nicht beherrschen und manuell mit fclose beendet werden muss
-
@DerAltenburger
Soll das lustig sein? Habe ich irgendwo geschrieben, dass dies vollständige Programme sind? Siehst du irgendwo eine Fehlerprüfung? Im C++-Programm? Meinst du jemand besitzt eine Datei "bakaablssl.mp3"?Meinst du es macht Sinn die Dateigröße zu bestimmen und dann fertig. Nicht mal eine Ausgabe?
Dir scheint es nicht aufgefallen zu sein, deshalb schreibe ich es nochmal explizt: Das sind Codeschnipsel! Sie sollen demonstrieren, wie man *prinzipiell* die Dateigröße einer Datei bestimmt. Sie demonstrieren *nicht* wie man ordentliche Programme schreibt.
Ich habe nicht mal garantiert, dass sie funktionieren. Ich habe sie nicht mal compiliert. Zugegeben, durch die Einbettung in main und durch das inkludieren der Header habe ich wohl einen falschen Eindruck erweckt. Auf der anderen Seite
muss ich aber auch nicht immer alles explizit hinschreiben.Weiß von mir aus darauf hin, dass am Ende der Dateibearbeitung ein fclose stehen sollte. Aber stell mich hier bitte nicht als Idiot dar, der zu blöd ist ne manpage zu lesen.
Aber trotzdem vielen Dank. Ist immer wieder schön zu sehen, dass ihr euch soviele Sorgen um meine Fähigkeiten macht.
[ Dieser Beitrag wurde am 30.03.2003 um 18:48 Uhr von HumeSikkins editiert. ]
-
schön rausgeredet hume
-
Meine Fresse, macht es doch einfach alle besser.
Dann brauche ich mich hier micht weiter rumärgern.
-
Das ist aber jemand schlecht gelaunt. Zu viel Stress, was?