#include<sys/stat.h>
#include<stdio.h>
#include<fcntl.h>
#include<sys/types.h>
int main()
{
  int n,i=0;
  int f1,f2;
  char c,strin[100];
  f1=open("data",O_RDWR|O_CREAT|O_TRUNC);

  while((c=getchar())!='\n')
  {
    strin[i++]=c;
  }
  strin[i]='\0';
  write(f1,strin,i);
  close(f1);

  f2=open("data",O_RDONLY);
  read(f2,strin,0);
  printf("\n%s\n",strin);
  close(f2);
  return 0;
}

此代码在某些计算机上可以正常运行,而在其他计算机上可以打印出垃圾,如何使其在所有计算机上正确运行?

最佳答案

您对read()的调用实际上并未读取任何内容。第三个参数是要读取的最大字节数,您将其传递为0:

read(f2,strin,0);

您需要将其大小传递给缓冲区,而要减去负1以容纳终止的nul字节:
int bytesread = read(f2,strin,99);  /* since your buffer is size 100 */
strin[bytesread] = '\0';

一直有效的唯一原因是因为您在第一次通过getchar()填充它和第二次通过read()对其进行填充之间都没有清除strin。因此,当您看到数据时,它是第一次出现的剩余数据。如果添加:
memset(strin, 0, 100);

到read()之前的原始代码,您将看到它永远不会在任何计算机上打印数据。

09-17 13:38