2014-11-08 71 views
1

我正在製作一個簡單的程序,在該文件的開始位置我想寫下一節的大小。當我在記事本中打開文件時,大小被正確寫入。然而,當我嘗試在程序中解析它時,我得到「輸入字符串格式不正確」。例外。 下面是我用它寫入文件的代碼:當從文件(C#)讀取時,數字拒絕從字符串轉換爲int

StreamWriter writer = new StreamWriter(stream, ENCODING); 

int headerSize = ENCODING.GetByteCount(Header); 
writer.Write(headerSize.ToString(HEADER_SIZE_FORMAT)); 
writer.Write(Header); 

writer.Close(); 

下面是我用它來嘗試,並從文件中讀取(拋出異常)的代碼:

FileStream stream = new FileStream(path, FileMode.Open); 

int headerSizeLength = ENCODING.GetByteCount((0).ToString(HEADER_SIZE_FORMAT)) + ENCODING.GetByteCount("1"); 
byte[] headerSizeArray = new byte[headerSizeLength]; 
stream.Read(headerSizeArray, 0, headerSizeLength); 

System.Windows.Forms.MessageBox.Show(ENCODING.GetString(headerSizeArray)); 

int headerSize = Convert.ToInt32(ENCODING.GetString(headerSizeArray)); 

(我從那裏正確關閉了流,但這並不重要,因爲這裏引用的最後一行引發了異常)

ENCODING的值當前是Encoding.Unicode。 HEADER_SIZE_FORMAT的值目前爲「0000」。

我最初想寫十六進制格式的大小(「X8」我認爲),但遇到解析同樣的問題,它改變了通常的十進制格式...

,顯示我的字符串的MessageBox在我試圖解析它之前,它顯示出正確的數字 - 0188,匹配格式和所有。

我將額外的字符長度添加到緩衝區長度,因爲在它讀取一個字符比它應該有的少,根據MessageBox和我在記事本中看到的。這可能是一個同樣的問題的症狀,但我不明白什麼是錯誤的)=

此外:當我硬編碼的數字,而不是試圖從文件解析它,其餘部分似乎解析成正確的字符串。 ..

+0

從你的代碼看起來像Header是一個結構或類是如何定義的? – 2014-11-08 15:36:57

+0

標題只是一個字符串屬性! – Liliet 2014-11-08 17:08:01

回答

4

你真的可以用

string buffer = File.ReadAllText(path); 
string header = buffer.Substring(0, 4); // 4 hardcoded based on the write.ToString("0000") 
int headerSize = Convert.ToInt32(header); 
Console.WriteLine(headerSize); 

簡化代碼與實際代碼的問題是,你讀二進制模式的文件。這意味着您的讀取也是the UTF8 preamble的前3個字節。當然,這些字節在有效的數字字符串中是不可轉換的,因此你會得到轉換錯誤。

如果您在閱讀二進制模式文件堅持到底,那麼你需要考慮到這一點UTF8序言

FileStream stream = new FileStream(path, FileMode.Open); 

// Count the bytes of your header_size_format plus the UTF8 preamble length 
int headerSizeLength = ENCODING.GetByteCount(HEADER_SIZE_FORMAT) + 
         ENCODING.GetPreamble().Length; 
byte[] headerSizeArray = new byte[headerSizeLength]; 

// Read preamble and your header 
stream.Read(headerSizeArray, 0 , headerSizeLength); 

// Start to convert the byte array in a string just after the preamble bytes. 
int headerSize = Convert.ToInt32(ENCODING.GetString(headerSizeArray, 
           ENCODING.GetPreamble().Length, 
           HEADER_SIZE_FORMAT.Length)); 

它說,這種情況發生,只是因爲,當你在你第一次創建您的文件很重要例如,你明確地要求在StreamWriter構造函數中使用UTF8編碼。

如果您省略了該參數,則文件將在不使用UTF8前導碼的情況下創建,因此需要更改讀數。總而言之,我認爲您應該避免以二進制模式讀取文件,並直接使用File.Read或StreamReader讓框架完成其從文件中返回字符串的工作。

+0

哦!謝謝! 它只是頭文本而已。之後,我會有二進制數據)= – Liliet 2014-11-08 16:53:06

+1

而'HEADER_SIZE_FORMAT.Length'沒有給出所需的結果。我使用了'ENCODING.GetByteCount((0).ToString(HEADER_SIZE_FORMAT)'),如上所示:] – Liliet 2014-11-08 17:03:13