#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;
}
这些代码在某些机器上工作得很好,而在其他机器上打印出垃圾,如何在所有机器上正确运行?
答案 0 :(得分:2)
您对read()的调用实际上并没有读取任何内容。第三个参数是要读取的最大字节数,并且您将其传递给0:
read(f2,strin,0);
您需要将缓冲区的大小传递给它,减去一个以容纳终止的nul字节:
int bytesread = read(f2,strin,99); /* since your buffer is size 100 */
strin[bytesread] = '\0';
这是有效的唯一原因是因为你没有在第一次通过getchar()填充它和第二次读取()时清除strin。因此,当您看到数据时,它是第一次剩余的数据。如果添加:
memset(strin, 0, 100);
到read()之前的原始代码,你会发现它从不在任何机器上打印数据。
答案 1 :(得分:0)
我认为这个问题很简单,当你使用getchar()来获取字符直到'\ n'时,你实际上并没有考虑到 Windows回车是\ r \ n,而它在Unix中是\ n 您将在下面的链接中获得详细信息
Does Windows carriage return \r\n consist of two characters or one character?
P.S。我是新来的,所以如果这个答案不是你想要的话,我会事先道歉。
答案 2 :(得分:0)
您编写的代码无法正常工作!问题很简单!或者你写,然后你也读到字符串末尾的\ x0,或者,当你读,你将\ x0添加到读取字符串的末尾! :)
还保存\ x0
write(f1,strin,i+1);
阅读并添加\ x0
i=read(f2,strin,sizeof(strin)-1);
strin[i]=0;
我认为最好的解决方案是第二个!;)