Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo,

Will für mein C++ Programm eine simple Fortschrittsanzeige einbauen, damit meine Kollegen sehen, wie weit sie sind. Das Programm selbst liest Daten aus einer Binärdetai in ein und schreibt diese dann in eine Textdatei. Dazu läuft einfach nur eine Schleife durch.

Mit Hilfe des Schleifenzählers, will ich nun den Fortschritt des Prozesses berechnen. Dazu muss ich vorher die genaue Größe meiner Datei in Byte berechnen bzw. auslesen.

Hier im Forum habe ich schon den Thread http://forum.fachinformatiker.de/showthread.php?postid=173950&highlight=Dateigr%F6%DFe#post173950

gefunden, allerdings bringt mich das nicht so richtig weiter.

Da ich nach der Zeile:

int stat(const char *fileread, struct stat *buf);

Weder die Adresse der Zeiger, geschweige denn deren Werte auslesen kann. Kann mir jemand winen Tip geben, wie ich dort anknüpfen sollte? Ist dabei der Dateiname der einzulesenden Datei. Die Auswahl erfolgt über:
 cout << "\n\nGeben Sie den Dateinamen der zu bearbeitenden Datei ein: ";

cin.getline(fileread, 64);

while (cin.get() !='\n'); // Tastaturpuffer leeren für Schleife bei falscher Eingabe

ifstream ifl(fileread, ios::in|ios::binary); //öffnen der Datei zur Eingabe im Binärmodus

if (!ifl)	

Die Funktion tauchte in meiner Literatur gar nicht auf. Deswegen bin ich jetzt einfach davon ausgegangen, das es sich um eine Variable handelt, in die die Größe der Datei eingelesen wird.

Ich spinne jetzt mal den Faden weiter, und probiere folgendes aus.

Zunächst muss ich also die Bibliotheken stat.h und types.h in mein Projekt über #include einfügen.

Und danach muss ich die Variable off_t für die Berechnung nutzen, also:


int stat(const char *fileread, struct stat *buf);

int groesse = &stat.off_t

So würde ichs machen:


ifstream file("deinedatei");

file.seekg(0, ios::end);

unsigned long byte= streamoff(file.tellg()); 

Und danach eben

  for (string line; getline(file, line); )        

{

  // Pseudocode

   // ( line.tellp() / (byte/100))

   // zeile in neue datei schreiben

}

Habs jetzt gemäß Thread Thread 668872 so gelöst:


#include <sys/stat.h>

#include <sys/types.h>

struct stat buf;

stat(fileread,&buf);

int groesse = buf.st_size;

Analog kann man dann noch diverse andere Dateimerkmale auslesen:


st_mode; //Dateiart und Zugriffsrechte
st_ino; //i-node Nummer
st_dev; //Geraetenummer (Dateisystem)
st_rdev; //Geraetenummer fuer Geraetedatei
st_nlink; //Anzahl der Links auf die Datei
st_uid; //User-ID des Eigentuemers
st_gid; //Group-ID des Eigentuemers
st_size; //Groeße in Byte fuer normale Dateien
st_atime; //Zeit d. letzten Zugriffs (access time)
st_mtime; //Zeit d. letzten Aenderung in der Datei
st_ctime; //Zeit der letzten Aenderung der i-node
st_blksize; //voreingestellte Blockgroeße
st_blocks; //Anzahl der benoetigten 512-Byte-Bloecke
[/PHP]

Vielen Dank an alle, die geholfen haben.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.