Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
.NET File.WriteAllines在文件末尾保留空行_.net_Arrays_Line - Fatal编程技术网

.NET File.WriteAllines在文件末尾保留空行

.NET File.WriteAllines在文件末尾保留空行,.net,arrays,line,.net,Arrays,Line,当我使用System.IO.File.WRITEALLINES保存字符串[]数组的内容时,文件末尾始终保留一个空行。例如: System.IO.File.WriteAllLines(Application.dataPath + "/test.txt",["a", "b", "c"]); 生成文件(不带下划线): 已经有了这样的话题:,但autor说“我认为我的数据有问题,这是我的问题,但不是写行”,它被关闭为“太本地化了”(?!?) 是虫子吗?我怎样才能轻松地摆脱它(现在我只是在再次读取文件时

当我使用System.IO.File.WRITEALLINES保存字符串[]数组的内容时,文件末尾始终保留一个空行。例如:

System.IO.File.WriteAllLines(Application.dataPath + "/test.txt",["a", "b", "c"]);
生成文件(不带下划线):

已经有了这样的话题:,但autor说“我认为我的数据有问题,这是我的问题,但不是写行”,它被关闭为“太本地化了”(?!?)


是虫子吗?我怎样才能轻松地摆脱它(现在我只是在再次读取文件时忽略它)?

WriteAllines写入数组中的每个条目并附加一个换行符。
正如您所看到的,每个字符串都在它自己的行上,这意味着您的最后一个条目以换行符结尾,并且您在文件中看到了一行。您可以通过文件的十六进制转储来证明这一点

查看WriteAllines的源代码可以证实这一点。

在内部,它使用该方法。

writeAllines方法将写出数组中的每一行,然后换行。这意味着您将始终在文件中获得此“空行”

您在链接的帖子中指出的一点是,当运行
ReadAllLines
时,认为一行是以换行符结尾的字符。因此,当您在刚刚编写的文件上使用read方法时,应该返回完全相同的行

如果以不同的方式读取文件,则必须自己处理换行符


本质上,你看到的是预期的行为。

正如其他人所指出的,这就是它的工作原理。下面是一个不需要额外换行的方法:

public static class FileExt
{
    public static void WriteAllLinesBetter(string path, params string[] lines)
    {
        if (path == null)
            throw new ArgumentNullException("path");
        if (lines == null)
            throw new ArgumentNullException("lines");

        using (var stream = File.OpenWrite(path))
        using (StreamWriter writer = new StreamWriter(stream))
        {
            if (lines.Length > 0)
            {
                for (int i = 0; i < lines.Length - 1; i++)
                {
                    writer.WriteLine(lines[i]);
                }
                writer.Write(lines[lines.Length - 1]);
            }
        }
    }
}
写道:

aenter benter c 安特尔 本特 C
我做了同样的事情,只是加了一句话:3,希望这能帮助别人

    for(int i = 0; i < Length; i++)
    {
        line = getLocation(i).X.ToString("0.0", nfi) + ',' + getLocation(i).Y.ToString("0.000", nfi) + ',' + getColorRaw(i).R.ToString("0.000", nfi) + ',' + getColorRaw(i).G.ToString("0.000", nfi) + ',' + getColorRaw(i).B.ToString("0.000", nfi);
        writer.Write(line);
        if( i < Length - 1) writer.Write("\n");
for(int i=0;i
要去掉尾随的换行符,最好的解决方案是,当您使用
.ReadAllLines()
阅读它时,实际上从字符串数组中删除最后一个元素。

我最简单的方法是使用AppendAllText作为最后一行:

if ($i -ne $lines.Count - 1){
     $newLines += $lines[$i]
    } else {
     $lastLine = $lines[$i]
}

[IO.File]::WriteAllLines($file.FullName, $newLines);
[IO.File]::AppendAllText($file.FullName, $lastLine);
@Virtlink解决方案几乎是完美的。事实上,有一种情况是,当文件存在且其内容大于新内容时,您会在文件末尾收到垃圾。在写入新文件内容之前,只需将文件长度重置为零

    public static void WriteAllLinesBetter(string path, params string[] lines)
    {
        if (path == null)
            throw new ArgumentNullException("path");
        if (lines == null)
            throw new ArgumentNullException("lines");

        using (var stream = File.OpenWrite(path))
        {
            stream.SetLength(0);
            using (var writer = new StreamWriter(stream))
            {
                if (lines.Length > 0)
                {
                    for (var i = 0; i < lines.Length - 1; i++)
                    {
                        writer.WriteLine(lines[i]);
                    }
                    writer.Write(lines[lines.Length - 1]);
                }
            }
        }
    }
公共静态void writeAllinesBetter(字符串路径,参数字符串[]行)
{
if(路径==null)
抛出新的ArgumentNullException(“路径”);
如果(行==null)
抛出新的ArgumentNullException(“行”);
使用(var stream=File.OpenWrite(path))
{
stream.SetLength(0);
使用(var writer=新的StreamWriter(流))
{
如果(lines.Length>0)
{
对于(变量i=0;i
有一个更简单的解决方法:

// 1. Convert the items on the array to single string with the separator "\n" between the items
string AllItemsInOneString= string.Join("\n", StringArrayToSave);

// 2. Save with WriteAllText instead
File.WriteAllText(FilePath, AllItemsInOneString);

您还可以使用WriteAllText保存文件,并手动加入行数组,如:

File.WriteAllText(file, String.Join("\r\n",correctedLines));

数组中的最后一个条目是否以换行符结尾?我已经展示了作为参数给出的示例数组:[“a”、“b”、“c”]它只包含常用的字母。我知道最好的方法是使用
writealText
String。Join
\r\n
作为分隔符?还要看看String的性能。Join和stringbuildersion始终存在“最后一行”,不管是否为空,我不明白为什么最后写入的行必须为空。ReadAllLines生成的最后一个数组元素是一个文件行,它不以换行符结尾-它只是最后一行。将WriteAllines保存的文件与XmlSerializer保存的文件进行比较。Serialize,您就会明白我的意思。@TiagoFreitasLeal:都不是o按照我在第一段中所说的去做。代码的工作方式是在数组的每一项后面加一个换行符。这意味着数组中的最后一项后面会加一个换行符。这意味着文件以换行符结尾,这意味着最后一行上有一个空字符串。这是一个必要的产品of表示该尾随新行的任何表示(如果您不确定为什么要考虑如何用同一个文件来表示同一个文件之间的差异),也就是响应“从RealLayLine得到的最后一个数组元素是一个不以断线结尾的文件行”。-这不是真的。您可能会认为它会在每个项目之间放置一个换行符,这会导致文件末尾没有换行符。但这不是它的工作方式。在内部,它几乎会在输入中对每个项目执行一个
foreach
,并对每个项目执行一个
WriteLine
WriteLine
>这就是为什么每一项都以换行符结尾。无论你认为正确的方式做这件事当然不重要,这只是代码的工作方式。如果接收数组结构中实际读取了空字符串,这将是一个部分解决方案。问题表明事实并非如此。工作起来很有魅力。我来了在这一点上,也有一个不错的选择。很荣幸能改为
var-writer
// 1. Convert the items on the array to single string with the separator "\n" between the items
string AllItemsInOneString= string.Join("\n", StringArrayToSave);

// 2. Save with WriteAllText instead
File.WriteAllText(FilePath, AllItemsInOneString);
File.WriteAllText(file, String.Join("\r\n",correctedLines));