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”)工作得非常好。