首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我尝试打开一个文件时,为什么我的文件中缺少空格

当我尝试打开一个文件时,为什么我的文件中缺少空格
EN

Stack Overflow用户
提问于 2010-10-19 20:22:25
回答 4查看 225关注 0票数 1

我写了一小段代码来打开这个文件,我的文件内容如下,每行长度为94个字符,行终止符是\r和\n

101 111111111 1111111111010190542A094101

9000000000001000000000000000000000000000000000000000000

//同样适用于该文本

101 111111111 1111111111010190608A094101

52001 1 1 CCD1 101019101019 1111000020000001 6201110000251 00000000011 1 0111000020000001 820000000100111000020000000000000000000000000000000000000000011 111000020000001 9000001000001000000010011100002000000000001000000000000

代码语言:javascript
运行
复制
     private void mnuOpen_Click(object sender, EventArgs e)
    {
        string strFilePath = string.Empty;
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.FileName = string.Empty;
        openFileDialog1.RestoreDirectory = true;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            strFilePath = openFileDialog1.FileName;
            StreamReader sr = new StreamReader(strFilePath);
            string str = string.Empty;
            str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
            sr.Close();
            if (str.Length % 94 == 0)
            {
                 //Do some thing
             }
           }

但是我在这里没有得到一个错误,谁能告诉我为什么

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-19 20:29:27

这94个字符是包括还是不包括换行符?字符串"a\r\nb"的长度是四个字符,而不是两个。根据完整的文件内容验证行长度似乎有点困难。例如,可能是文件以\r\n对结尾,也可能不是。我更喜欢单独读取行,并验证每行的修剪长度。

更新

您可以通过将内容与预期的行长进行匹配来验证内容:

代码语言:javascript
运行
复制
public static bool StringIsValid(string input, int expectedLineLength)
{
    return input.Replace("\r\n", "").Length % expectedLineLength == 0;
}

// called like so:
if (StringIsValid(str, 94))
{
   // do something
}

然而,这并不是很准确。假设我们需要4个字符的字符串:

代码语言:javascript
运行
复制
string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 4); // returns true

看起来没问题。但是,请考虑以下内容:

代码语言:javascript
运行
复制
string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 6); // returns true

这也返回true,因为我们检查的唯一一件事是字符串的总长度(在去掉换行符之后)可以均匀地分成6个字符的行。使用12个字符的字符串是可能的,但这并不意味着它实际上是由6个字符的行组成的。因此,更好的方法是检查行的长度。您可以逐行读取,进行验证,如果可以,则将其添加到输出中:

代码语言:javascript
运行
复制
private static bool LineHasCorrectLength(string line, int expectedLineLength)
{
    return line.Length == expectedLineLength;
}

// usage:
using (StreamReader reader = File.OpenText("thefile.txt"))
{
    while (!reader.EndOfStream)
    {
        string line = reader.ReadLine();
        if (LineHasCorrectLength(line, 94))
        {
            // add to output
        }
    }
}

获取所有行,验证它们的长度,如果它们验证OK,则使用它们(在本例中使用LINQ All扩展方法):...or:

代码语言:javascript
运行
复制
private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
{
    return lines.All(s => s.Length == expectedLineLength);
}

// usage:
string[] lines = File.ReadAllLines("thefile.txt");
if (LinesHaveCorrectLength(lines, 94))
{
    // do something
}

更新2

根据您的注释,这应该适用于您的代码(使用上面示例代码中的LinesHaveCorrectLength方法,只有在所有行都具有预期长度时才会返回true ):

代码语言:javascript
运行
复制
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    strFilePath = openFileDialog1.FileName;
    string[] lines = File.ReadAllLines(strFilePath);
    if (LinesHaveCorrectLength(lines, 94))
    {
        // add lines to grid
    }
}

更新3

LinesHaveCorrectLength的非LINQ版本

代码语言:javascript
运行
复制
private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
{
    foreach (string item in lines)
    {
        if (item.Length != expectedLineLength)
        {
            return false;
        }
    }
    return true;
}
票数 2
EN

Stack Overflow用户

发布于 2010-10-19 20:27:43

我的第一个尝试是使用File.ReadAllLines,然后再考虑行的长度。

票数 1
EN

Stack Overflow用户

发布于 2010-10-19 20:28:42

您不会收到错误,因为没有任何错误。但是,您需要处理str.Length % 94 != 0的情况,因为ReadToEnd将在字符串中包含换行符,这就是mod 94不能执行此工作的原因。另一种方法是读取每一行(使用ReadLine)并检查其长度。ReadLine确实删除了换行符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3968243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档