C程序使用不在循环中工作的系统调用从文件中读取备用字符

问题描述 投票:1回答:1

我创建了一个程序,它从作为终端参数传递的文件中读取备用字符并将其打印在终端上。该计划是:

#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个备用字符,但循环从第二个字符本身打印不同的字符。我哪里错了?为什么重复代码工作和循环不?

c linux file operating-system system-calls
1个回答
4
投票

你需要#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);
}
© www.soinside.com 2019 - 2024. All rights reserved.