尝试编写显示大文件前5行的程序时出错。
C:\blah\aeea2>dir
Volume in drive C has no label.
Volume Serial Number is B411-D580
Directory of C:\blah\aeea2
16/10/2016 05:48 AM <DIR> .
16/10/2016 05:48 AM <DIR> ..
16/10/2016 05:42 AM 388 prog.csc
16/10/2016 05:42 AM 4,096 prog.exe
16/10/2016 05:48 AM 19,500 testfile
3 File(s) 23,984 bytes
2 Dir(s) 2,879,127,552 bytes free
以上生成我的文件。它是500行,每行有z个字符。
C:\blah\aeea2>type prog.csc
class a{
public static void Main(string[] args) {
string line;
System.Collections.Generic.List<string> lststr = new System.Collections.Generic.List<string>();
int i=0;
while( (line=System.Console.In.ReadLine())!=null ) {i++; lststr.Add(line); if(i==5) break;}
for(i=0; i<lststr.Count; i++) System.Console.WriteLine(lststr[i]);
}
}
你在这里看到我的节目
C:\blah\aeea2>type testfile| prog.exe
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
The process tried to write to a nonexistent pipe.
C:\blah\aeea2>
这是错误
C:\blah\aeea2>type smallfile.txt
a
b
c
d
e
f
g
h
i
j
C:\blah\aeea2>type smallfile.txt| prog.exe
a
b
c
d
e
C:\blah\aeea2>
但它适用于非常小的文件
n-th
答案 0 :(得分:2)
这不是你的程序,它实际上是type
命令。
type
会尝试将完整的文件内容写入管道并将其发送到您的程序。但是你的程序只消耗前5行并退出。因此type
抱怨不再存在消费者(管道)。
为了使其在没有警告/错误的情况下工作,最好在i == 5
之后消耗完整输入而不是中断并将其丢弃。但是,通过阅读不需要的内容,它会浪费CPU和IO。
它适用于较小文件的原因是剩余的字节适合管道缓冲区(通常为4kB,8kB,并非所有Windows系统都100%确定)。
barlop 添加了
涉及上述的一些有趣的发现,以及命令,gnuwin32 cat,cygwin cat,以及环境cmd和cygwin,我发现了以下内容。 他们都工作(/不会遇到错误),zbynek的调整(让我的程序读取很多)。 但没有zbynek的调整 - gnuwin32 cat命令在cmd中不起作用,它的行为类似于类型,在输出行后,它显示“写入错误:无效的参数” cygwin cat命令如果从cmd完成,则不起作用,它说“写入错误:设备上没有剩余空间” windows'more'命令可以在cmd中运行(或者不出所料,来自cygwin)。这样就可以代替'type'。 从cygwin,cat - gnuwin32 cat或cygwin cat,工作。 我会测试来自cygwin的'type',但我尝试过,我不认为cygwin可以运行类型,它内置于cmd.exe shell中,并没有自己的可执行文件,我不认为cygwin可以看到它。