我创建了一个程序,它从作为终端参数传递的文件中读取备用字符并将其打印在终端上。该计划是:
#include<stdio.h>
#include<unistd.h>
int main(int argc, char * argv[])
{
int fd = open(argv[1]);
if(fd>0)
{
char content[1];
while(read(fd,content,1))
{
write(1,content,1);
lseek(fd,1,SEEK_CUR);
}
}
else
{
printf("File could not be opened.\n");
}
return 0;
}
但它是以奇怪的模式打印字符。但是,当我通过一个接一个地重复它来使用该代码时,它正在打印替代字符。这是什么工作:
read(fd,content,1);
write(1,content,1);
lseek(fd,1,SEEK_CUR);
read(fd,content,1);
write(1,content,1);
lseek(fd,1,SEEK_CUR);
read(fd,content,1);
write(1,content,1);
我的输入文件:
abcdefgh
ijklmnopq
rstuvwxyz
输出我得到:
ikmoq
suwy
替代字符我的意思是跳过1个字符。
该代码从文件中打印3个备用字符,但循环从第二个字符本身打印不同的字符。我哪里错了?为什么重复代码工作和循环不?
你需要#include <fcntl.h>
,但这不是实际问题。
输出
ikmoq
suwy
实际上是预期的。
输入文件
abcdefgh
ijklmnopq
rstuvwxyz
在内存qazxsw poi中看起来像这样,因为在Windows行结尾下用“\ r \ n”表示两个字节13和10。
您正在打印每隔一个字符,因此您打印:
'a''c''e''g''\ r''我''k'等
但是当您使用abcdefgh\r\nijklmnopq\r\nrstuvwxyz
进行原始输出时,write
只将光标放在行的开头,因此后续字符将覆盖已打印的字符。
像这样更改你的程序:
\r
这显示了从文件中实际读取的字节数。
输出:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char * argv[])
{
int fd = open("input.txt", O_RDONLY);
if (fd > 0)
{
char content[1];
while (read(fd, content, 1))
{
if (content[0] == '\r')
{
static char cr[] = "<CR>";
write(1, cr, sizeof cr - 1);
}
else if (content[0] == '\n')
{
static char lf[] = "<LF>";
write(1, lf, sizeof lf - 1);
}
else
{
write(1, content, 1);
lseek(fd, 1, SEEK_CUR);
}
}
}
else
{
printf("File could not be opened.\n");
}
return 0;
}
使用aceg<LF><CR>ikmoq<CR>rtvxz
简化版本的while循环,自动处理行结尾:
putc
仅使用系统调用的版本(这可能取决于平台):
while (read(fd, content, 1))
{
putc(content[0], stdout);
lseek(fd, 1, SEEK_CUR);
}