#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);
你需要传递缓冲区的大小,减去一个来容纳一个终止的nul字节:
int bytesread = read(f2,strin,99); /* since your buffer is size 100 */ strin[bytesread] = '\0';
这是有史以来唯一的原因是因为你没有清除之间的第一次通过getchar()和第二次当你读()到它之间的限制。 所以当你看到数据的时候,这是第一次剩下的数据。 如果你添加一个:
memset(strin, 0, 100);
到read()之前的原始代码,您将看到它从不在任何机器上打印数据。
我认为这个问题是一个简单的问题,当你使用getchar()来获取字符直到'\ n'时,你实际上并没有将Windows回车计为\ r \ n,而在Unix中是\ n。在下面的链接
Windows回车\ r \ n是由两个字符还是一个字符组成?
PS我在这里是一个新手,所以如果这个答案不是你正在寻找的,我很抱歉。
你写的代码不能正常工作! 问题很简单! 或者你写,然后你也读取字符串末尾的\ x0,或者当你读到的时候,把\ x0加到读取字符串的末尾! 🙂
另存\ x0
write(f1,strin,i+1);
阅读并添加\ x0
i=read(f2,strin,sizeof(strin)-1); strin[i]=0;
我认为最好的解决方案是第二个!)