Ausgabe an den Anfang der Datei setzen

Ahoi ich habe mal den folgen Code


// Der Variablen Differenz wird die Differenz zwischen Stop- und Startzeit zugewiesen
Differenz=Stopp_Zeit-Start_Zeit;

// Die Datei myfile.txt wird geöffnet in infile zugewissen
ofstream infile;
infile.open("myfile.txt");


//Der Inhalt der Variablen Differenz wird auf infile gespeichert
infile << Differenz;

// infile wird geschlossen
infile.close();

Ich will, dass der Inhalt der Variablen Differenz die Datei nicht überschreibt sondern vorne dran gehängt wird. Ich habe es mit

infile.open("myfile.txt",ios_base::ate);
probiert, das gibt aber zwei Fehler aus

C:\Timer\TimerDlg.cpp(302) : error C2653: 'ios_base' : Keine Klasse oder Namespace
C:\Timer\TimerDlg.cpp(302) : error C2065: 'ate' : nichtdeklarierter Bezeichner

Im Netz habe ich auch nur diesen Beispiel gefunden. Ich programmieren mit VC++ 6.0 Prof und WIN 2000.
 
also... es gibt soweit ich weiss keine möglichkeit etwas am anfang des file einzufügen

man sollte überhaupt mit std arbeiten.. wieso auch immer.. aber naja machs halt, also oben

#include <fstream> //nich fstream.h

dann halt deine file

std::fstream outfile; //auch ne tolle idee ne ofstream, also _OUTPUT_filestream-file infile zu nennen bei deinem prog

dann öffnen wir sie

outfile.open("dif.txt", std::ios::binary | std::ios::out);

was der unterschied ist ob man es jetzt mit std::ios_base::out oder std::ios::out macht.. weiss nich ob ios von ios_base vererbt ist oder ka... kommt aufs selbe raus

na jedenfalls.. wenn du etwas vorne einfügen willst müsstest du

- datei öffnen
- inhalt einlesen und temporär speichern
- in die datei das was du vorne reinschreiben willst.. halt hinschreiben
- den gespeicherten inhalt hinten dranhängen

das ist so als wenn du bücher auf nem bücherregal hast die links an der wand anstehen, du kannst rechts ein buch dazustellen aber um eines ganz links oder in der mitte einzufügen musst du alle rechts davon um eins nach rechts schieben damit du platz für dein buch hast.. digns

<alle angaben ohne gewähr>
 
Visual C++ 6.0 Prof. unter WIN 2000

Code:
// TimerDlg.cpp : Implementierungsdatei
//

#include "stdafx.h"
#include "Timer.h"
#include "TimerDlg.h"
#include "fstream.h"
#include "iostream.h"
#include "string.h"



#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// Variablen für Start-, Stop-, und Differenzzeit
int Start_Zeit;
int Stopp_Zeit;
int Differenz;

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialogfelddaten
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
	//}}AFX_VIRTUAL

// Implementierung
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// Keine Nachrichten-Handler
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTimerDlg Dialogfeld

CTimerDlg::CTimerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTimerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTimerDlg)
	m_sTime = _T("");
	m_iInterval = 0;
	m_sCount = _T("");
	//}}AFX_DATA_INIT
	// Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTimerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTimerDlg)
	DDX_Control(pDX, IDC_STOPTIMER, m_cStopTimer);
	DDX_Control(pDX, IDC_STARTTIME, m_cStartTime);
	DDX_Text(pDX, IDC_STATICTIME, m_sTime);
	DDX_Text(pDX, IDC_INTERVAL, m_iInterval);
	DDV_MinMaxInt(pDX, m_iInterval, 1, 100000);
	DDX_Text(pDX, IDC_STATICCOUNT, m_sCount);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTimerDlg, CDialog)
	//{{AFX_MSG_MAP(CTimerDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_EXIT, OnExit)
	ON_WM_TIMER()
	ON_EN_CHANGE(IDC_INTERVAL, OnChangeInterval)
	ON_BN_CLICKED(IDC_STARTTIME, OnStarttime)
	ON_BN_CLICKED(IDC_STOPTIMER, OnStoptimer)
	ON_BN_CLICKED(IDC_Speichern, OnSpeichern)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTimerDlg Nachrichten-Handler

BOOL CTimerDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.

	// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{	
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
	
	// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen

	// Zählerinterval initialisieren
	m_iInterval = 100;

	// Dialogfeld aktualisieren
	UpdateData(FALSE);

	// Timer für die Uhr starten
	
	SetTimer(ID_CLOCK_TIMER,1000,NULL);

	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
}

void CTimerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie 
//  den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das 
//  Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.

void CTimerDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // Gerätekontext für Zeichnen

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Symbol in Client-Rechteck zentrieren
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Symbol zeichnen
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
//  das zum Symbol verkleinerte Fenster mit der Maus zieht.
HCURSOR CTimerDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CTimerDlg::OnExit() 
{
	OnCancel();	
}

void CTimerDlg::OnTimer(UINT nIDEvent) 
{

	// Aktuelle Zeit holen
	CTime curTime= CTime::GetCurrentTime();
	// Welcher Timer hat das Ereignis ausgelöst ?
	switch (nIDEvent)
	{
		// Der Uhrentimer ?
	case ID_CLOCK_TIMER:
		// Aktuelle Zeit anzeigen
		m_sTime.Format("%d:%d:%d", curTime.GetHour(),
			curTime.GetMinute(),
			curTime.GetSecond());
		break;
		// Der Zählertimer ?
	case ID_COUNT_TIMER:
		// Zähler inkrementieren
		m_iCount++;
		// Zähler formatieren und anzeigen
		m_sCount.Format("%d", m_iCount);
	}
	// Dialogfeld aktuallisieren
	UpdateData(FALSE);

	CDialog::OnTimer(nIDEvent);
}

void CTimerDlg::OnChangeInterval() 
{
	// TODO: Wenn dies ein RICHEDIT-Steuerelement ist, sendet das Steuerelement diese

	// Benachrichtigung nicht, bevor Sie nicht die Funktion CDialog::OnInitDialog()

	// überschreiben und CRichEditCrtl().SetEventMask() aufrufen, wobei

	// eine ODER-Operation mit dem Attribut ENM_CHANGE und der Maske erfolgt.

	

	// TODO: Fügen Sie hier Ihren Code für die Benachrichtigungsbehandlungsroutine des Steuerelements hinzu
	
	// Variablen aktualisieren
	UpdateData(TRUE);
	
}

void CTimerDlg::OnStarttime() 
{
	// Der Variable Start_Zeit wird die aktuelle Zeit zugewiesen
	Start_Zeit = GetCurrentTime();


	//Variablen aktuallisieren
	UpdateData(TRUE);

	//Zähler initialisieren
	m_iCount = 0;

	// Zähler für Anzeige formatieren
	m_sCount.Format("%d",m_iCount);

	//Dialogfeld aktualisieren
	UpdateData(FALSE);
	//Timer starten
	SetTimer(ID_COUNT_TIMER, m_iInterval,NULL);
	// Schaltfläche Timer anhalten aktivieren
	m_cStopTimer.EnableWindow(TRUE);
	// Schaltfläche Timer starten deaktivieren
	m_cStartTime.EnableWindow(FALSE);
}

void CTimerDlg::OnStoptimer() 
{
	// Der Variable Stopp_Zeit wird die aktuelle Zeit zugewiesen
	Stopp_Zeit = GetCurrentTime();
	//Timer anhalten
	KillTimer(ID_COUNT_TIMER);
	// Startfläche Timer starten aktivieren
	m_cStartTime.EnableWindow(TRUE);
	// Schaltfläche Timer anhalten deaktivieren
	m_cStopTimer.EnableWindow(FALSE);

}


void CTimerDlg::OnSpeichern() 
{
	int sekunden, minuten, stunden;

	// Der Variablen Differenz wird die Differenz zwischen Stop- und Startzeit zugewiesen
	Differenz=Stopp_Zeit-Start_Zeit;
	
	// Die Datei myfile.txt wird geöffnet in infile zugewissen
	ofstream infile; 
	infile.open("myfile.txt"); // <-- hier ist die Problemstelle
	
	// Kontrollieren ob Stunden vorhanden sind und wenn ja dann reinspeichern

	stunden = Differenz / 3600000;
	infile  << stunden;

	
	// Kontrollieren ob Minuten vorhanden sind und wenn ja dann reinspeichern
	minuten = Differenz / 60000;
	infile << ":" << minuten % 60;

	
	
	sekunden=Differenz/1000;
	
	//Der Inhalt der Variablen Sekunde wird auf infile gespeichert
	infile << ":" << sekunden % 60 << "\n";

	
	// infile wird geschlossen
	infile.close();

}
 
benutz mal den standard namespace und mach die includes folgendermaßen
Code:
#include "stdafx.h"
#include "Timer.h"
#include "TimerDlg.h"
#include <fstream>
#include <iostream>
#include <string>

using namespace std;
dann sollte es gehen
btw "std::" brauchst du dann nicht mehr vor ios usw. schreiben
 
Original von Vevusio
allerdings imported er dann den gesamten namespace und die exe wird dadurch unnötig größe (oder?)
nein "using namespace std;" sagt dem compiler ja nur das der namensraum "std" verwendet werden soll und wenn er eine klasse/funktion/konstante nicht kennt, er in diesem namespace danach suchen und diese verwenden soll
das heißt nicht dass die gesamte c++ standard library includiert werden soll

btw selbst wenn man überflüssige header included, wird die .exe datei dadurch auch nicht größer werden
denn was nicht verwendet wird, kommt afaik auch nicht in die anwendung
 
Zurück
Oben