2012-12-08 8 views
1

나는이 같은 구조체 (가) 포함 파일이 있습니다 단어를 들어BinaryWriter.Write (INT32)

public struct index 
{ 
    public string word;   //30 bytes 
    public int pos;    //4 bytes 
}; 

을, 나는 그것을 쓰기 전에 30 바이트로 확장 확인하고 POS가 나는대로 쓰기 int32가 4 바이트라는 것을 알고 있기 때문입니다. 여기

파일에 작성하는 코드입니다 :

for (i = 0; i < ind.word.Length; i++) 
{ 
    bword[i] = (byte)idx_array[l].word[i]; 
} 
for (; i < SIZE_WORD; i++) //30 
{ 
    bword[i] = 0; 
} 
bw_idx.Write(bword, 0, SIZE_WORD); 
bw_idx.Write(ind.pos); 

코드 컴파일 잘 한 가지를 제외하고 작동 : 기록 얻을 나던 INT32. 내가 메모장을 사용하여 파일을 선택하면 ++ 나는 INT이 있어야 할 곳을 참조하십시오 SOH NULL NULL NULL 내가 SOH를 고개가 (제목의 시작) SOH 있어야하는데 :

이 문자의 시작을 표시하는 데 사용됩니다 이 주소는 주소 또는 라우팅 정보가 포함 된 일 수 있습니다.

내 int32가 쓰지 않는 이유는 무엇이 있습니까? 당신이 (파일이 프로젝트의 bin debug 폴더에 저장됩니다) 시도 할

코드 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 

namespace test_write 
{ 
    class Program 
    { 
     struct enreg 
     { 
      public string word; 
      public int pos; 
     } 

     const int SIZE_WORD = 30; //30 bytes 
     const int SIZE_POS = 4; //4 bytes 

     static byte[] bword = new byte[SIZE_WORD];   
     static byte[] bpos = new byte[SIZE_POS]; 

     static void Main(string[] args) 
     { 
      enreg enr = new enreg(); 

      Console.Write("word : "); 
      enr.word = Console.ReadLine(); 
      Console.Write("\anumber : "); 
      enr.pos = int.Parse(Console.ReadLine()); 

      FileStream fs = File.Open("temp", FileMode.Create, FileAccess.ReadWrite); 
      BinaryWriter bw = new BinaryWriter(fs); 

      int i = 0; 
      for (i = 0; i < enr.word.Length; i++) 
      { 
       bword[i] = (byte)enr.word[i]; 
      } 
      for (; i < SIZE_WORD; i++) 
      { 
       bword[i] = 0; 
      } 
      bpos = BitConverter.GetBytes(enr.pos); 

      bw.Write(bword, 0, SIZE_WORD); 
      bw.Write(bpos, 0, SIZE_POS); 

      fs.Close(); 

     } 
    } 
} 
+0

메모장 ++ 대신 16 진수 편집기를 사용하는 것이 좋습니다. [Frhed] (http://frhed.sourceforge.net/en/)는 멋진 opensource입니다. 또한 파일을 제대로 닫았는지 확인하십시오. –

+0

또한,'FileStream.Write (Int32)'도 표시되지 않습니다. ['BinaryWriter.Write (Int32)'] (http://msdn.microsoft.com/en-us/library/24e33k1w (v = vs.100) .aspx)를 의미합니까? –

+0

잘 닫혀 있고 작동하지 않아도 작동하지 않습니다. – AntoineLev

답변

1

BinaryWriter 형식으로 인코딩 그 결과를 기록합니다. 텍스트를 출력하려면 StreamWriter을 사용하십시오. 텍스트와 바이트는 직접 관련이 없습니다. 그것들을 동일하게 취급 할 수는 없습니다.

그리고 바이트로 변환하여 문자를 쓰지 마십시오. 이것이 불가능한 이유를 모르는 경우 문자 인코딩에 대해 읽어보십시오. 이것은 모든 프로그래머가 가질 필요가있는 아주 기본적인 지식입니다.

+0

idk 인코딩에 대해 나는 단지 내 선생님의 예를 uppon이라고 생각하고있다 ... – AntoineLev

+1

하지만 그는 조금 oldschool이다;) – AntoineLev