Datei schreiben
-
Ja, wo kommt denn die AccessViolation? ->Debugger...
-
[cpp]void TForm1::schreibschutz(void)
{
if (geschuetzt == 1 )
{
FileSetAttr(datei, FileGetAttr(datei) ^ faReadOnly); // schreibschutz aufheben
//aufgehoben = 1;
return;
}
else
return;
}
[/cpp]weil du in der if ja 2 .. äh 2 vorgänge hast !
aber das hätt ja der compiler merken müssen..sonst wo passierts denn? (@HEZ)
-
Blackhawk schrieb:
sonst wo passierts denn? (@HEZ)
Weiß ich doch nicht! :p
(Spaß!)Nun, die Korrektur der If-Abfrage macht eigentlich gar keinen Unterschied,
else returnwird ja eh ignoriert, wenns nach return kommt.

-
hi,
irgendwie kommt der Fehler nicht wenn ich mitm debugger durchgeh ....
wie meinst das ??weil du in der if ja 2 .. äh 2 vorgänge hast !
aber das hätt ja der compiler merken müssen..
sonst wo passierts denn? (@HEZ)versteh nicht warum die 2 anweisungen in meinem if ein problem sein sollen is doch ein ganz normale
if (x==y) { machwas } else ....chris
-
chri5 schrieb:
hi,
irgendwie kommt der Fehler nicht wenn ich mitm debugger durchgeh ....Aha. Dann gibts keinen Fehler und alle sind glücklich?
versteh nicht warum die 2 anweisungen in meinem if ein problem sein sollen is doch ein ganz normale
if (x==y) { machwas } else ....chris
Diese lustigen Dinger um "machwas"...hmm... was bedeuten die wohl? Wo muss man die hinsetzen? Und wo fehlen sie?
-
danke,
ja ... hab die korrigierte version angeschaut .... jetzt hab ichs auch verstanden ....
aber wie schon selber gesagt hast .... wenn dann wird eben nur der erste befehl beachtet ... reutrn kommt immer .....also daran dürfts doch net liegen ...
hab gefunden wo er ihn macht .... aber gestern war das noch net so
....
aber der macht den wirklich nicht immer ... hab jetzt das programm öfter debuggt und immer in die gleiche datei schreiben wollen .. manchmal kam er manchmal nicht ... ....if (CheckBox3->Checked == true ) { if ( v1 == true ) // überschreiben { //if (geschuetzt == 1) schreibschutz(); // alten id3 V1 überschreiben ; dat = fopen(datei.c_str(),"ab" ); fseek(dat,-128,SEEK_CUR); <<<<<--- hier macht er ihn !! fseek(dat,0,SEEK_CUR); fwrite(&schreiben,sizeof(id3),1,dat); fclose(dat); if (CheckBox5->Checked == true) sch_zurueck(); Label8->Caption = "ID3-Tag Version 1 geschrieben" ; }hab die zeile jetzt so geschrieben
fseek(dat,-128L*sizeof(char),SEEK_CUR);ach verdammt ... das erste mal gings ... dan net ..dann doch ...dann net ....
.. chris
-
der komplette code :
/--------------------------------------------------------------------------- #include <vcl.h> #include <stdio.h> #pragma hdrstop #include "id3.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { CheckBox4->Enabled= false; CheckBox3->Checked=true; geschuetzt = 0; } //--------------------------------------------------------------------------- AnsiString TForm1::ChTOAn(char *feld, int i) // Char to AnsiString { int a; AnsiString erg; for(a=0;a<i;a++) { if(feld[a]==NULL) return erg; else erg += feld[a]; } return erg; } //------------------ void TForm1::tag_lesen(void) { FILE *dat; // tag - lesen dat = fopen(OpenDialog1->FileName.c_str(),"rb"); fseek(dat,-128,SEEK_END); fread(&gelesen,sizeof(gelesen),1,dat); fclose(dat); return; } //------------------ void wandel(char *eins ,char *zwei ,int i) { int x; for(x=0;x<i;x++) { eins[x] = zwei[x]; } } //---------------------- void TForm1::tag_neu_lesen(void) { AnsiString gen; char x; char tg[3] = "TAG"; wandel(&schreiben.tag[0],&tg[0],3); wandel(&schreiben.title[0],Edit2->Text.c_str(),30); wandel(&schreiben.artist[0],Edit3->Text.c_str(),30); wandel(&schreiben.album[0],Edit4->Text.c_str(),30); wandel(&schreiben.year[0],Edit5->Text.c_str(),4); wandel(&schreiben.comment[0],Edit6->Text.c_str(),30); schreiben.genre[0] = 0; //gen = ComboBox1->Text; //x = gen_schr(gen); //wandel(&schreiben.genre[0],&x,1); return; } //--------------- void TForm1::auto_umbenennen(void) { AnsiString name; AnsiString art,tit; tit = ChTOAn(gelesen.title,30); art = ChTOAn(gelesen.artist,30); name = art ; name +="-"; name +=tit; name += ".mp3"; Label7->Caption=name; } //----------------- void TForm1::schreibschutz(void) { if (geschuetzt == 1 ) { FileSetAttr(datei, FileGetAttr(datei) ^ faReadOnly); // schreibschutz aufheben //aufgehoben = 1; return; } else return; } //---- void TForm1::sch_zurueck(void) { if (CheckBox5->Checked == true ) { FileSetAttr(datei, FileGetAttr(datei) || faReadOnly); // aufgehoben = 0; return; } else return ; } //---------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int i; AnsiString name; AnsiString a,b,c,d,e; AnsiString gen_ver; AnsiString v1_test; OpenDialog1->Execute(); datei = OpenDialog1->FileName; //------------------------------------------------------------ // datei - name ausgeben Edit1->Text = ExtractFileName(OpenDialog1->FileName); // schreibschutz ?? FileSetAttr(datei, FileGetAttr(datei) ^ faReadOnly); // schreibschutz aufheben /* if ((FileGetAttr(datei) && faReadOnly) > 0) { geschuetzt = 1; // File ist geschützt CheckBox2->Checked=true ; } else { geschuetzt = 0 ; // nicht schreibgeschützt CheckBox2->Checked = false ; }*/ // lesen tag_lesen(); // char-feld in AnsiString wandlen v1_test = ChTOAn(gelesen.tag,3); // testen ob vorhanden wenn vorhanden dann ausgeben if (v1_test.AnsiCompare("TAG")==0) { // auto umbenennen auto_umbenennen(); // ID3 - Ausgabe a=ChTOAn(gelesen.title,30); b=ChTOAn(gelesen.artist,30); c=ChTOAn(gelesen.album,30); d=ChTOAn(gelesen.year,4); e=ChTOAn(gelesen.comment,30); Edit2->Text = a;//gelesen.title ; // eins; Edit3->Text = b;//gelesen.artist; Edit4->Text = c;//gelesen.album; Edit5->Text = d; Edit6->Text = e; //gen_ver = gen(gelesen.genre[0]); i = *gelesen.genre; if (i>79 ) i =-1; ComboBox1->ItemIndex = i; //gen_ver; //ComboBox1->Text = ComboBox1->Items->Strings[i]; //gen_ver; CheckBox1->Checked = true ; //CheckBox2->Checked = false ; v1= true; } else { v1=false; ShowMessage("Kein ID3v1 Tag gefunden !!"); //CheckBox2->Checked = true ; CheckBox1->Checked = false ; Label7->Caption = ""; Edit2->Text = ""; Edit3->Text = ""; Edit4->Text = ""; Edit5->Text = ""; Edit6->Text = ""; ComboBox1->ItemIndex = -1; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { // manuelle eingabe Dateiname AnsiString anhang,name; name = Edit1->Text; anhang = ExtractFileExt(name); if (anhang.AnsiCompare(".mp3")) name +=".mp3"; RenameFile(OpenDialog1->FileName,name); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { // Automatische eingabe Dateiname Title-Artist.mp3 RenameFile(datei,Label7->Caption); datei; //RenameFile(OpenDialog1->FileName,Label7->Caption); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { FILE *dat; int Atr,schreib; tag_neu_lesen(); // schreiben wird gefüllt if (CheckBox3->Checked == false && CheckBox4->Checked == false) { ShowMessage("Bitte Version die geschrieben werden soll wählen"); } if (CheckBox3->Checked == true ) { if ( v1 == true ) // überschreiben { //if (geschuetzt == 1) schreibschutz(); // alten id3 V1 überschreiben ; dat = fopen(datei.c_str(),"ab" ); fseek(dat,-128L*sizeof(char),SEEK_CUR); fseek(dat,0,SEEK_CUR); fwrite(&schreiben,sizeof(id3),1,dat); fclose(dat); if (CheckBox5->Checked == true) sch_zurueck(); Label8->Caption = "ID3-Tag Version 1 geschrieben" ; } else // hinten anhängen { //if (geschuetzt == 1)schreibschutz(); // hinten anhängen dat = fopen(datei.c_str(),"ab" ); //fseek(dat,-128,SEEK_CUR); //fseek(dat,0,SEEK_CUR); fwrite(&schreiben,sizeof(id3),1,dat); fclose(dat); if (CheckBox5->Checked == true) sch_zurueck(); Label8->Caption = "ID3-Tag Version 1 geschrieben" ; } tag_lesen(); auto_umbenennen(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button5Click(TObject *Sender) { int erg; erg =MessageDlg("Wirklich Schließen ?",mtConfirmation,TMsgDlgButtons() << mbYes << mbNo,0); if (erg == mrYes) { Close(); } } //---------------------------------------------------------------------------HEADER ::
//--------------------------------------------------------------------------- #ifndef id3H #define id3H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Dialogs.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Komponenten, die von der IDE verwaltet werden TButton *Button1; TButton *Button2; TButton *Button3; TButton *Button4; TButton *Button5; TEdit *Edit1; TEdit *Edit2; TEdit *Edit3; TEdit *Edit4; TEdit *Edit5; TEdit *Edit6; TComboBox *ComboBox1; TCheckBox *CheckBox1; TCheckBox *CheckBox3; TCheckBox *CheckBox4; TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4; TLabel *Label5; TLabel *Label6; TLabel *Label7; TOpenDialog *OpenDialog1; TLabel *Label8; TCheckBox *CheckBox2; TCheckBox *CheckBox5; void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); void __fastcall Button3Click(TObject *Sender); void __fastcall Button4Click(TObject *Sender); void __fastcall Button5Click(TObject *Sender); private: // Benutzerdeklarationen AnsiString datei; bool v1; struct id3 { char tag[3]; char title[30]; char artist[30]; char album[30]; char year[4]; char comment[30]; char genre[1]; }; struct id3 gelesen; struct id3 schreiben; int geschuetzt; //int aufgehoben; public: // Benutzerdeklarationen __fastcall TForm1(TComponent* Owner); AnsiString TForm1::ChTOAn(char *feld, int i); void TForm1::tag_lesen(void); void TForm1::tag_neu_lesen(void); void TForm1::auto_umbenennen(void); void TForm1::sch_zurueck(void); void TForm1::schreibschutz(void); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
-
Ich würde zuerst einmal die beiden Funktionen ChTOAn() und wandel() weglassen. Die brauchst du nämlich nicht.
Bei ersterer kannst du einem AnsiString ein char* einfach zuweisen.
char test1[] = "Ein Test";
AnsiString astr = test1;
Für zweitere gibt es die Funktion strcpy bzw. strncpy (die ist besser).
-
hi,
leider weis ich immer nich net worans liegt .. ?
chris
-
chri5,
chri5 schrieb:
... dat = fopen(datei.c_str(),"ab" ); fseek(dat,-128,SEEK_CUR); <<<<<--- hier macht er ihn !! ...da es sporadisch aufzutreten scheint: Prüfe zur Sicherheit die Gültigkeit des File-Pointers. Vielleich lungern ja noch irgend welche offenen streams in Deinem Code herum ... ist nur so 'ne Idee.
-
hi,
hab jetzt einfach alles was ab dem Fehler dazu kam nochmal geschrieben ....
jetzt klappts ...
irgendwie hab ich mir mit dem schreibschutz selber ein bein gestellt glaub ich ... egal ..jetzt gehts ....
danke
chris