【问题标题】:Read file and send across a socket connection not looping读取文件并通过套接字连接发送而不是循环
【发布时间】:2015-10-06 02:08:51
【问题描述】:

我正在尝试打开一个文件,将其读入,然后通过套接字连接将其逐行发送到等待的客户端。我遇到的问题是由于某种原因循环不起作用,每次触发“LIST”命令时它只会发送文件的第一行。

                   else if (cmd.compare(list) ==0) /* LIST user input */
                    {
                        file_ptr = fopen("file1.txt", "r");

                        while (fgets(buf, sizeof(buf), file_ptr) != NULL) {

                                    {

                                    while(!feof(file_ptr))
                                    send (new_s, buf, strlen(buf) + 1, 0);
                                    printf("%s",buf);
                                }


                    }

                            fclose(file_ptr);
                    }

谁能看到我做错了什么?

客户端“LIST”命令的输出(每次都输入 LIST 以获得这些结果)

列表

ECHO:matthew funk 3123214321

列表

回声:3123214321

列表

ECHO:tthew funk 3123214321

列表

回声:23214321

列表

ECHO:hew funk 3123214321

列表

回声:214321

列表

ECHO:w funk 3123214321

列表

回声:4321

列表

ECHO:funk 3123214321

^C

正在读入的文件内容

"file1.txt" 12L, 399Cc

马修芬克 3123214321

1000Jonny Applesee7655431234

1001比利·乔尔 7312431234

1002比利偶像 123456789

1003Jean Doe 9876543211

1000 peauntbuJelly 123456789

1001妈妈THreasea987654321

1000 彼得保罗和

1000 计算机网络i12341234123

1001 计算机网络i12341234123

1002 计算机网络i12341234123

1003 计算机网络i12341234123

【问题讨论】:

  • while(!feof(file_ptr)) 应该做什么(除了创建无限循环)。我不认为那是你真正的代码,因为没有办法跳出那个循环。
  • @user 我认为这会逐行发送文件的输出,直到它到达 EOF
  • while(fgets... 循环逐行发送文件,直到到达 EOF。 while(!feof...) 循环没有任何用处。您可能应该有一个内部循环,一直调用send,直到所有字节都发送完毕,但while(!feof...) 绝对不是这样做的方法。
  • 好吧,我对 while(!feof跨度>

标签: c sockets loops logic


【解决方案1】:
while (fgets(buf, sizeof(buf), file_ptr) != NULL) {
{
    while(!feof(file_ptr))
        send (new_s, buf, strlen(buf) + 1, 0);
    printf("%s",buf);
}

while (!feof(file_ptr)) 循环毫无意义。你一遍又一遍地发送同样的东西,直到feof() 发生,它永远不会因为你没有从文件中读取。而且您已经以之前的!= NULL 的形式对 EOF 进行了测试。

我不会为此使用fgets(),也不会使用strlen()。无需对数据做出假设。在这种情况下,您假设它是没有嵌入空值的文本。你只需要这个:

size_t count;
while ((count = fread(buf, 1, sizeof buf, file_ptr)) > 0)
{
    send(new_s, buf, count, 0);
}

事实上,我也不会为此使用stdio,只使用open()read()close() ...

【讨论】:

  • 这太棒了!谢谢!为了让我理解它以备将来使用,你能了解一下“while”循环在做什么吗?比如buf后面的数字1,为什么被比作大于0?还伯爵如何在没有犯罪的情况下工作?在发送命令中,那里的 0 是做什么的?根据有关“发送”的文档,那是标志的占位符.. 零是否意味着没有标志?
猜你喜欢
  • 1970-01-01
  • 2023-03-02
  • 2012-05-11
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多