从文件读取时,Number拒绝从string转换为int(C#)

时间:2014-11-08 14:55:41

标签: c# file string-formatting filestream streamwriter

我正在创建一个简单的程序,在文件的开头我想写下一节的大小。当我在记事本中打开文件时,正确写入了大小。但是,当我尝试在程序中解析它时,我得到“输入字符串格式不正确”。例外。 这是我用来将其写入文件的代码:

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和我在记事本中看到的内容,它在读取之前读取的字符少于应有的字符数。这可能是同一问题的症状,但我无法理解什么是错的)=

另外:当我对数字进行硬编码而不是尝试从文件中解析数字时,其余部分似乎正确地解析为字符串...

1 个答案:

答案 0 :(得分: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,让框架在从文件中返回字符串时起作用。