Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Fehler bei zu kurzen Strings fr Char-Array

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehr || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
15.07.2007, 23:18 Uhr
~Bonzon
Gast


Hi, ich hab mal eine Frage.
Ich versuche gerade mehrere Variablen in einer einfachen Text-Datein zu speichern.
Hier mein Code:


C++:
TCHAR str[30];

    UpdateData( TRUE );

        _tcscpy( str, m_text );
    
    CFileDialog m_dlgFile(FALSE); // TRUE = Datei ffnen,



    if( m_dlgFile.DoModal() == IDOK )
        {
        m_pathname = m_dlgFile.GetPathName();
        }

    CFile datei( m_pathname, CFile::modeCreate | CFile::modeWrite );
    datei.Write( str, sizeof( str ) );

    datei.Close();



So soweit klapp das alles auch, wenn der String m_test genau 30 Zeichen lang ist.
Wenn aber der String krzer ist, dann bekomme ich durchweg chinesiche Zeichen in der Text-Datei zu sehen.

Was soll ich denn davon halten.
Ich hoffe jemand kennt das Problem und kann mir dabei helfen.

MfG

Bonzon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
001
16.07.2007, 00:51 Uhr
xXx
Devil


hmm das ist nen bissel komisch was du da machst ...

C++:
data.Write(str, sizeof(str) * 30);
sollte es doch richtig lauten Oo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
002
16.07.2007, 01:00 Uhr
~Bonzon
Gast


Ok nun kommen immerhins chon mal keine chinesiches Zeichen mehr, aber dafr jede menge sinnloser Text.


Zitat:

Test (  DA   sC_d Xl"
 @ T +{C_( / @ d Xl" d ( HL_8m" h I_ C C  K7C_/ d Xl" (   cB_/ d Xl" (  I_  L*woO Vwа[w  D /  eB_/ D d Xl" ( _%v t zv (  t v v
ՏvoO! X  d   ⻎v  oO  4voO =v
 0     uI_ P  HL_8m"  I_ P l wJ_ B_ / D  ( x B_ / D P   ~" < GI_ X )B_ l"   pvJ_  %B_(   / D P  (  I_  / D  l" h QuJ_  v  / D  ͫ P  x vSI_  / D ^ⅸE  8 $  0 v D   vD vv~  j(v SI_  / D E  (  " SI_  +vE PE / D   Ǝv  / D  ǎv( ( " v ǎv"  , ( GI_< ÅC_9C 9C   D  C_ 9C iI_I_ p ~" >"  GI_( XQⅰ .cv(      vD    ͫ ,  T vbvD   P :C :C ( $  0 v `    vv~  G*v bvD   <  pP :C E  v | :C h vv ~ *vbv  v:C  :C :C  E  ژv (  p t Q_ :C  p  " G    G G D   X_ gC_( :C  p" (  C_:C  p(  7C_:C  p(   H C_:C  p(   CC_ :C 9C C_( 0 C_:C  p9C l !C_ p9C 9C (  :C  EC_  p ʔ (  RC PYC PYC @ x  uJ_  o@ pDC   m"   `v  f f ̼B B L_L_L_L_ L_L_L_L_L_L_ L_ L_L_L_L_L_L_<E < L_L_L_A L_A _ L@ @ _ @ L C   m"  {1 / L_L_L_L_L_L_L_L_L_L_  C   m" L_C   m" `v

   * 9C  A  #5C_ p9C 9C  A @
,"   A @
,"  p
," ` `  D 4" (8" P8"     HA 0C  38w p vw pN p  sw@ww A p Actx  0    4 l   N& D  ` [IY-, 2 `  q2` J   2 B  6 _P8H ^  h D( V h      l    8        x*    -   $.   .  / (  SsHd,       , Z Z  $ 4 C : \ W i n d o w s \ W i n S x s \ N& D ` `  [IY- 2    q2 J @   2`
B
6  _P8



Hmm nun bin ich verwirrt. Meine Frage ist, wenn ich nun mehrere Variablen in eine textdatei schreiben mchte, dann bruchte ich ja einen Trenner, auf den ich reagiere. Aber das dumme ist nur, wenn ich nun ein String von 10 Zeichen habe und dann noch 20 Leerzeichen dahinter.
Sprich

1234567890_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _@@( @@ = Trenner )09876543231_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _@@

Hmm das kann doch nicth richtig sein??

Ich hoffe jemand hat eine Idee, wie ich das ganze Lsen kann.

MfG

Bonzon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
003
16.07.2007, 11:35 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,
nimm StdioFile und benutz WriteLine direkt mit deinem m_text.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
004
16.07.2007, 19:27 Uhr
~Bonzon
Gast


Hmmm...

Aber eigentlich msste das ganze doch auch so gehen? oder...
Gibt es denn keine Lsung mit meiner Variante??

Ich bitte um Hilfe.

MfG

Bonzon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
005
16.07.2007, 20:44 Uhr
xXx
Devil


Write ist nicht dafr gedacht einen String zu schreiben ... so wie es aussieht ... scheint er binr zu schreiben ... guck mal mit nem binreditor an ... mal sehen was dann drin steht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
006
16.07.2007, 22:46 Uhr
~Bonzon
Gast


Hmm leider das selbe, aber Write soll ja auch gar keinen String schreiben, es soll ja Char schreiben und zwar genau 30ig Zeichen.
Komisch komisch....
Das muss doch irgendwie funktionieren.

MfG

Bonzon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
007
16.07.2007, 22:50 Uhr
xXx
Devil



C++:
TCHAR str[30];
UpdateData( TRUE );
lstrncpy(str, 30, m_text);
... ich wei sowieso nicht warum du es kopierst ... was steht eig. in m_text drin? debug halt mal ...

Dieser Post wurde am 16.07.2007 um 22:51 Uhr von xXx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
008
21.07.2007, 02:40 Uhr
~Bonzon
Gast


Hi,

so ich hab noch ein wenig rumprobiert.

Also lstrncpy funktioniert bei mir nich. Ich hab VC++ 6.0 und dann is das nicht deklariert.

in m_text steht beim Debug drin

der Text "test" drin,

und in der Variable str

steht der Hexcode

0x0012f38c

Vieleicht sagt jemanden das was.

Ehm wenn ich statt str, m_test in die write funktion nehme, dann schreibt er mit den String rein, aber nur 4 Zeichen davon, kann ich das bestimmen?

Ich hoffe jemand findet eine Lsung

MfG

Bonzon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
009
21.07.2007, 09:10 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Also:

es gibt 2 Mglichkeiten: du schreibst binr: dann kriegst du deine vollen 30 Zeichen, nur sind wenn in deinem text "test" drinsteht, nur die ersten 5 zeichen mit sinnvollen daten belegt, der rest ist nonsense (siehe oben)

oder du schreibst nur die 5 Zeichen deines Strings, dann ist der nonsense weg.

Ansonsten sollte man fr Textdateien in deinem Fall CStdioFile verwenden:


C++:
UpdateData( TRUE );

CFileDialog m_dlgFile(FALSE); // TRUE = Datei ffnen,

if( m_dlgFile.DoModal() == IDOK )
{
   m_pathname = m_dlgFile.GetPathName();
}

CStdioFile datei( m_pathname, CFile::modeCreate | CFile::modeWrite );
datei.WriteString(m_text);
datei.Close();



dann landet in deiner Datei auch nur soviel, wie in m_text drinsteht.

Bei


C++:
datei.Write( str, sizeof( str ) );


liefert dir sizeof(str) 4, da str ein pointer ist und sizeof beim kompilieren durch konstanten ersetzt wird.


C++:
datei.Write( str, sizeof( str ) * 30 );


will er dir natrlich 4 * 30 zeichen schreiben - was natrlich vlliger bldsinn ist, da du ja insgesamt nur 30 Zeichen reserviert hast in deinem str.


C++:
datei.Write( str, sizeof(TCHAR) * 30 );


das wrde nur 30 Zeichen schreiben.

da km dann halt sowas raus:


Code:
Test



da die restlichen 25 Zeichen uninitialisiert sind und nur die ersten 5 Zeichen ("Test" + '\0')
gesetzt sind.
--
class God : public ChuckNorris { };

Dieser Post wurde am 21.07.2007 um 09:11 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Lschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: