Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取文件末尾的回车符_C# - Fatal编程技术网

C# 读取文件末尾的回车符

C# 读取文件末尾的回车符,c#,C#,我正在编写一个验证类,以确保有效文件被发送到第三方软件。这些文件的末尾需要回车符,但当我读入它们以确保文件末尾有回车符时,我使用的库会忽略最后一行。如果我在这行加上空格,它会读出来,但如果我不加空格,它就会被忽略 我尝试了System.IO.File、FileStream.ReadLines、StreamReader、和StringReader,使用了这些类所具有的所有方法ReadAllLines()、ReadAllText()、ReadLines(),等等 任何人都知道解决这个问题的方法。到目

我正在编写一个验证类,以确保有效文件被发送到第三方软件。这些文件的末尾需要回车符,但当我读入它们以确保文件末尾有回车符时,我使用的库会忽略最后一行。如果我在这行加上空格,它会读出来,但如果我不加空格,它就会被忽略

我尝试了
System.IO.File
FileStream.ReadLines
StreamReader
、和
StringReader
,使用了这些类所具有的所有方法
ReadAllLines()
ReadAllText()
ReadLines()
,等等

任何人都知道解决这个问题的方法。到目前为止,我还没有找到任何东西

目前,这是我的代码行

private void readfile()
{
    string[] lines = System.IO.File.ReadAllLines(filePath + file); 

     bool error  = ErrorValidatingLastLineOfFile(lines, lines.count());
}

private bool ErrorValidatingLastLineOfFile(string[] lines, int lastLine)
{
    if (lines[lastLine - 1] != "")
        return true;

    return false;
}
文件示例:

 1. [Section1]
 2. Error = 
 3. 
 4. [Section2]
 5. Error = 
 6.
 7. [Data]
 8. foo,bar,
 9.

数字是文件中不实际的行

使用
System.IO.File.ReadAllText

例如:

var text = System.IO.File.ReadAllText(filePath + file);
var isValid = text.EndsWith("\n");

我无法重现这种行为<如果一行不包含任何内容,code>ReadAllLines将返回空字符串:

File.WriteAllText("text.txt","a\n\n\n");
var lines=File.ReadAllLines("text.txt");

//The last line isn't ignored
Trace.Assert(lines.Length==3);

//The last line *is* empty
Trace.Assert(lines[2]=="");
Trace.Assert(lines[lines.Length -1]=="");
Trace.Assert(lines.Last()=="");

//So is any empty line
Trace.Assert(lines[2]=="");

原始代码正在检查错误的行-而不是最后一行
(长度-1)
它正在检查前一行
((长度-1)-1)
,即
长度-2
可能您只需要检查CR(13)而不是整行结束(CR+LF为13+10)。然后试试这个:

//read last char:
byte lastChar1 = System.IO.File.ReadAllBytes(filePath).Last();

//if a file is bigger, there is no need to read it all to just check the last char:
var fs = System.IO.File.OpenRead(filePath);
fs.Position = fs.Length-1;
var lastChar2 = fs.ReadByte();
fs.Close();

如果最后一个字符是CR,那么它应该是13。

哈哈,我不敢相信这是答案。非常感谢,先生。一旦允许,我会给你正确的答案。这不是回车,“\r”是。所以这不起作用,ReadAllText会修复行尾。FileStream是必需的。这不是答案
ReadAllLines
返回最后一个数组项的空字符串(如果它包含一个换行符)。您不必再次读取文件,只需检查最后一个字符ReadAllLines(),如果文件上没有任何内容,则忽略最后一行。因此,如果您将n更改为r,这对我很有效。ReadAllLines()忽略了回车符
ReadAllText
的作用,正如您所说的,我建议您显示检查文件是否以
\n
结尾的代码,查看如何创建一个供参考的。您正在读取的行意味着每个数组项只包含行,而不包含分隔符。没有其他内容的行应返回空字符串。你是说最后一个数组项不是空字符串吗?没有复制。读取包含空行的文件(无论是第一行还是最后一行)时,如果出现off by two错误,则会为每一空行返回一个空字符串。通过
count()-1
,然后使用
lastLine-1
。实际上,您选中了
count()-2
旁注:
返回(行[lastLine-1]!=”)
很好,不需要使用
返回true的
if
…抱歉,代码复制错误,但当我查看此数组时,我希望文件中有16项,但只有15项。我使用了intellisense,最后一行在不应该的时候有数据。它应该是空的。我的文件使用的是\r不是\n,因此如果我更改它,它是否仍然可以从另一面读取?我注意到您的答案是错误的,您有3行,因此行变量的长度应该是4而不是3。如果在记事本++中打开此文件,它有4行而不是3行。这是我在这里需要的最后一行(第四行)。@spaga您误解了在记事本++中看到的内容。没有第四行。仅仅因为Notepad++在最后一行换行后显示一个空行,并不意味着那里有一行。其他编辑器不会显示任何内容。在任何情况下,您的问题是您读错了行,这根本不是问题所在,正如我所解释的,我复制了错误的代码。我读对了。我还使用intellisense检查了数组中的值。另外,我已经打开了你的代码在Supreme和vs代码中创建的文件,这两个文件都显示了4行而不是3行。实际上,它的答案与Johnny的帖子完全相同<代码>\n
是ASCII代码表中的字节13:CR(回车)是13->这是:\r LF(新行/换行)是10->这是:\n在Windows中,通常行尾都是字符,顺序是:\r\n(CR+LF,13+10)。[在这里您可以找到更多关于它的信息:我的答案是关于\r(no:13),另一个是关于\n(no:10)。但是有效的ansewr也可以是:var isValid=text.EndsWith(“\r”);@Ursula这两个答案都是正确的,但是您的答案更好,因为它不需要我将文件存储在变量中。但是,text.EndWith(“\r”)工作得非常好。