【问题标题】:fwrite() doesn't finish writing to filefwrite() 没有完成写入文件
【发布时间】:2021-02-16 03:30:33
【问题描述】:

试图将文件从客户端发送到服务器。

这是我收到它的方式:

printf("Server receiving file...\n");
while((bytes_read = read(sd, buf, sizeof(buf))) > 0){ //second read now retrieving the file size
  printf("writing");
  fwrite(buf, 1, bytes_read, fp);
  printf("checking if reached here");
}

由于某种原因,第二个打印语句“检查是否到达这里”从未到达,程序只是没有退出循环。可能是什么问题?

PS。我的客户发送所有字节,因此发送没有问题。它只是写入文件

【问题讨论】:

  • @MikeCAT 如何删除空字节,因为我无法通过 Internet 找到方法。我的发送代码已发布。除此之外,尝试将空字节写入文件会有问题吗?
  • @MikeCAT 我也很抱歉,因为我已经完全改变了我的问题的上下文。我仍然想知道如何在发送之前删除空字节
  • 也许强制输出到屏幕上?在你的 printf 之后添加fflush(stdout);,或者,也许更好的是,用换行符终止打印:printf("...\n");
  • 达伦,“写作”出现了吗?如果不使用printf("writing\n"); 重试(添加\n)

标签: c byte fwrite fread


【解决方案1】:

您是否使用 fopen 函数打开了文件? 下面是一个小示例,说明您应该在脚本中的某处包含一段代码。

fp = fopen( "file", "w" );

检查你是否在某处有类似的行,否则你需要添加这个。

【讨论】:

  • 是的,我做到了。我打开文件进行创建以将内容复制到使用此 while 循环中。当我强制停止程序时,我可以看到文件实际上已经创建,但缺少一些内容。我假设那是因为我不得不强制停止它而不是循环自行退出
  • 会不会因为我在缓冲区中包含了空字节而无法正确写入?
  • read()fwrite()'\0' 无关,对他们来说只是一个字节
  • @pmg 出于某种原因,即使我没有更改任何内容,我的打印语句也已到达“检查是否到达此处”部分,但之后仍然没有退出循环。我认为这是因为我的 while 循环可能有错误的条件,即使没有任何内容,也只是试图继续阅读?
  • 也许客户端必须关闭连接?
【解决方案2】:

套接字是否阻塞(默认)?

如果是,只要没有数据要读取,read()就会挂起,等待 更多数据(或关闭套接字,在这种情况下它将返回 0 个字节)。

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多