我希望这个问题解释了我的问题。如果“有效”的解决方法,我将不胜感激。解释了。

传统阅读文件的方式(我知道)

int fd;
char buffer[MAX];
while(read(fd,buffer,MAX)>0)
{
         buffer[MAX]='\0';
         write(sockfd,buffer,MAX);
         memset(buffer,NULL,MAX);
}

导致溢出。某种意外工作的解决方法是

   while((read(fd,buffer,MAX)!=0)||(read(fd,buffer,MAX)!= -1))
   {
         buffer[MAX]='\0';
         write(sockfd,buffer,MAX);
         memset(buffer,NULL,MAX);

   }

^^这段代码打印出整个文件,没有可观察到的跳过。

这样的事情
do
{
     int temp;
     temp=read(fd,buffer,MAX);
     if((temp == 0) || (temp == -1))
     {
              break;
     }
     buffer[MAX]='\0';
     write(sockfd,buffer,MAX);
     memset(buffer,NULL,MAX);
 }while(1);

也导致堆栈溢出。我错过了一些非常重要的东西吗?

由于

有帮助吗?

解决方案

为什么你说它导致溢出?

请注意 read()不会在 char 数组的末尾写一个 \ 0 ,所以如果你这样做的话它可能会失败,因为 printf("%s",buffer),因为 printf 将期待一个NUL终止的字符串。您可能想要读取 MAX-1 并设置 buffer [number_of_read_characters] ='\ 0'其中 number_of_read_characters read( )返回,如果是肯定的。

另请注意,当您声明 char buffer [MAX] 时,因为在C索引中从零开始,最高 buffer 索引是 MAX-1 ,所以当你设置 buffer [MAX] ='\ 0'时,你已经超出数组边界。

其他提示

一个问题:

buffer[MAX]='\0';
堆栈上的步骤,因为MAX的数组的最高有效索引是MAX-1(由于基于0的索引)。

-1读取返回值表示错误,所以正确测试read()>此外,read的正常返回值是读取的字节数,而read不保证任何0终止。你必须按照

的方式做点什么
while (bytesRead=read() > 0) {
    write(buffer, bytesRead);
...

瞥了一眼代码,我建议这是因为逻辑不同。

在有效的示例中, read(fd,buffer,MAX)方法正在执行两次。

想想它:

while (dosomething() != 0 || dosomething() != -1)
{
    // some work
}

如果dosomething()方法是幂等的,则此循环将是无限的,但是如果第一次在while语句中运行它与第二次不同,它将会中断。

这解释了执行路径如何不同,但我无法弄清楚为什么第一个选项溢出......我会考虑并更新。 (或不 - 似乎已经回答了!)

试试这个:

int fd, readCharacter;
char buffer[MAX];
while( readCharacter = read(fd, buffer, MAX**-1**) > 0 )
{
    buffer[readCharacter] = '\0';
    // ...
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top