C# 使用C将多个文件写入一个文件时,行结束出现问题#

C# 使用C将多个文件写入一个文件时,行结束出现问题#,c#,file-io,streamwriter,C#,File Io,Streamwriter,我正在尝试将4组15个txt文件写入4个大型txt文件,以便更容易导入其他应用程序 这是我的密码: using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; namespace AggregateMultipleFiles { class AggMultiFilestoOneFile {/*This program can redu

我正在尝试将4组15个txt文件写入4个大型txt文件,以便更容易导入其他应用程序

这是我的密码:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AggregateMultipleFiles
{
    class AggMultiFilestoOneFile
    {/*This program can reduce multiple input files and grouping results into one file for easier app loading.*/
    static void Main(string[] args)
    {

        TextWriter writer = new StreamWriter("G:/user/data/yr2009/fy09_filtered.txt");  
        int linelen =495; 
        char[] buf = new char[linelen];
        int line_num = 1;

        for (int i = 1; i <= 15; i++)
        {
                TextReader reader = File.OpenText("G:/user/data/yr2009/fy09_filtered"+i+".txt"); 
            while (true)
            {
                int nin = reader.Read(buf, 0, buf.Length);
                if (nin == 0 )
                {
                    Console.WriteLine("File ended");
                    break;
                }
                writer.Write(new String(buf));

                line_num++;
            }
            reader.Close();

        }
        Console.WriteLine("done");
        Console.WriteLine(DateTime.Now);
        Console.ReadLine(); 
        writer.Close();

    }
  }
}
使用系统;
使用System.IO;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间聚合多个文件
{
类多文件源文件
{/*此程序可以减少多个输入文件,并将结果分组为一个文件,以便更轻松地加载应用程序*/
静态void Main(字符串[]参数)
{
TextWriter writer=newstreamwriter(“G:/user/data/yr2009/fy09_filtered.txt”);
int linelen=495;
char[]buf=新字符[linelen];
int line_num=1;

对于(int i=1;i我强烈怀疑这就是问题所在:

writer.Write(new String(buf));
您总是从所有
buf
创建一个字符串,而不仅仅是第一个
nin
字符。如果您的任何文件很短,您可能会得到“null”Unicode字符(即U+0000),在某些应用程序中,这些字符可能被视为字符串终止符

甚至不需要创建字符串-只需使用:

writer.Write(buf, 0, nin);
(顺便说一句,我还强烈建议使用
使用
语句,而不是手动调用
Close
。)

还值得注意的是,没有什么可以保证您一次真正读取一行。您最好将缓冲区大小增加到32K左右,以便以可能更少的块读取文件

此外,如果文件足够小,可以将每个文件完全读入内存,这将使代码更简单:

using (var writer = File.CreateText("G:/user/data/yr2009/fy09_filtered.txt"))
{
    for (int i = 1; i <= 15; i++)
    {
        string inputName = "G:/user/data/yr2009/fy09_filtered" + i + ".txt";
        writer.Write(File.ReadAllText(inputName));
    }
}
使用(var writer=File.CreateText(“G:/user/data/yr2009/fy09_filtered.txt”))
{

对于(int i=1;i我强烈怀疑这就是问题所在:

writer.Write(new String(buf));
您总是从所有
buf
创建一个字符串,而不仅仅是第一个
nin
字符。如果您的任何文件很短,您可能会得到“null”Unicode字符(即U+0000),在某些应用程序中,这些字符可能被视为字符串终止符

甚至不需要创建字符串-只需使用:

writer.Write(buf, 0, nin);
(顺便说一句,我还强烈建议使用
使用
语句,而不是手动调用
Close
。)

还值得注意的是,没有什么可以保证您一次真正读取一行。您最好将缓冲区大小增加到32K左右,以便以可能更少的块读取文件

此外,如果文件足够小,可以将每个文件完全读入内存,这将使代码更简单:

using (var writer = File.CreateText("G:/user/data/yr2009/fy09_filtered.txt"))
{
    for (int i = 1; i <= 15; i++)
    {
        string inputName = "G:/user/data/yr2009/fy09_filtered" + i + ".txt";
        writer.Write(File.ReadAllText(inputName));
    }
}
使用(var writer=File.CreateText(“G:/user/data/yr2009/fy09_filtered.txt”))
{

对于(int i=1;我知道您可以将文本文件与命令提示符“copy”命令一起追加,对吗?不,但我当然愿意尝试!每个文件包含大约100万行信息,我担心会丢失任何信息。这样安全吗?它从DOS时代(80年代)开始就存在了。我很确定他们解决了大部分主要故障。它没有像我预期的那样附加到fy09_filtered1.txt中。我做了前4个测试:COPY G:/user/data/yr2009/fy09_filtered1.txt+fy09_filtered2.txt+fy09_filtered3.txt+fy09_filtered4.txt您知道可以在命令提示符“COPY”下附加文本文件命令,对吗?不,但我当然愿意尝试!每个文件包含大约100万行信息,我担心会丢失任何信息。这样安全吗?它从DOS时代(80年代)开始就存在了。我很确定他们已经解决了大部分主要故障。它没有像我预期的那样附加到fy09_filtered1.txt中。我做了前4个测试:COPY G:/user/data/yr2009/fy09_filtered1.txt+fy09_filtered2.txt+fy09_filtered3.txt+fy09_filtered4.txt