c# - 从文件读取时,Number 拒绝从字符串转换为 int (C#)

标签 c# file string-formatting filestream streamwriter

我正在制作一个简单的程序,我想在文件的开头写下下一节的大小。当我在记事本中打开文件时,大小被正确写入。然而,当我尝试在程序中解析它时,我得到“输入字符串的格式不正确”。异常(exception)。 这是我用来将其写入文件的代码:

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 和我在记事本中看到的内容,我将额外的字符长度添加到缓冲区长度,因为在它读取之前它读取的字符比应有的字符少一个。这可能是同一问题的症状,但我不明白出了什么问题)=

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

最佳答案

你真的可以简化你的代码

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);

您实际代码的问题是您以二进制模式读取文件。这意味着您还读取了前 3 个字节 the UTF8 preamble .当然,这些字节不能转换为有效的数字字符串,因此会出现转换错误。

如果您坚持以二进制模式读取文件,那么您需要考虑这个 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 让框架完成其从文件返回字符串的工作。

关于c# - 从文件读取时,Number 拒绝从字符串转换为 int (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26818372/

相关文章:

wpf - 绑定(bind)返回 null 时隐藏多绑定(bind)字符串格式

c# - 警告 MSB4056 : The MSBuild engine must be called on a single-threaded-apartment

Java 工作区和文件路径

python - 使用 sudo 使用 python 创建文件使其所有者成为 root

java - 存储大型二进制文件

Python:根据*实际*长度填充字符串

javascript - 如何在 Javascript 中为字符串添加斜杠?

c# - 恢复Nuget包...他从哪里得到用户名?

c# - 具有 ChildActionOnly 属性问题的部分 View

c# - 重写属性 setter