我在尝试编写显示大文件前 5 行的程序时遇到错误。
C:\blah\aeea2>for /L %f in (1,1,500) do @echo zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz >>testfile
Run Code Online (Sandbox Code Playgroud)
上面生成了我的文件。它有 500 行,每行都有 z 字符。
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
Run Code Online (Sandbox Code Playgroud)
你在这里看到我的程序
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]);
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误
C:\blah\aeea2>type testfile| prog.exe
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
The process tried to write to a nonexistent pipe.
C:\blah\aeea2>
Run Code Online (Sandbox Code Playgroud)
但它适用于非常小的文件
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>
Run Code Online (Sandbox Code Playgroud)
这不是你的程序,它实际上是命令type。
type将尝试将完整的文件内容写入管道并将其发送到您的程序。但您的程序仅消耗前 5 行并退出。因此type抱怨不再存在的消费者(管道)。
为了使其在没有警告/错误的情况下工作,最好消耗完整的输入,而不是在之后中断i == 5并丢弃它。但是,它会通过读取不需要的内容来浪费 CPU 和 IO。
它适用于较小文件的原因是剩余字节适合管道缓冲区(通常为 4kB、8kB,在所有 Windows 系统上并非 100% 确定)。
添加者: 巴洛普
涉及上述内容以及命令、gnuwin32 cat、cygwin cat、环境 cmd 和 cygwin 的一些有趣的发现,我发现了以下内容。
通过 zbynek 的调整(使我的程序读取大量内容),它们都可以工作(/不会遇到错误)。
但如果没有兹比涅克的调整——
gnuwin32 cat 命令在 cmd 中不起作用,它的行为与 type 类似,并且在输出行后,它显示“写入错误:无效参数”
如果从 cmd 执行 cygwin cat 命令,则不起作用,它显示“写入错误:设备上没有剩余空间”
Windows 的“more”命令在 cmd 中运行(或者不出所料,在 cygwin 中运行)。因此可以使用它来代替“类型”。
从 cygwin 开始,cat - 无论是 gnuwin32 cat 还是 cygwin cat,都可以工作。
我会从 cygwin 测试“类型”,但我尝试过,但我不认为 cygwin 可以运行类型,它内置于 cmd.exe shell 中,没有自己的可执行文件,我不认为 cygwin 可以看到它。
| 归档时间: |
|
| 查看次数: |
5674 次 |
| 最近记录: |