我试图打开一个文件,读入它,然后通过套接字连接将它逐行发送到等待的客户端。我遇到的问题是由于某种原因,循环无法正常工作,每次我点击“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都是为了获得这些结果)

列表

回声:马修放克3123214321

列表

回声:3123214321

列表

回声:tt​​hew放克3123214321

列表

回声:23214321

列表

回声:he克3123214321

列表

回声:214321

列表

回声:w放克3123214321

列表

回声:4321

列表

回声:放克3123214321

^ C

中读取的文件的内容

“file1.txt” 12L,399Cc

马修放克3123214321

1000强尼Applesee7655431234

1001比利·乔尔7312431234

1002比利·偶像123456789

1003让·多伊(Jean Doe)9876543211

1000豌 bean 果冻123456789

1001母亲THreasea987654321

1000彼得和

1000个计算机网络i12341234123

1001计算机网络i12341234123

1002计算机网络i12341234123

1003计算机网络i12341234123

最佳答案

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()。无需对数据进行假设。在这种情况下,您假设它是没有嵌入null的文本。您需要的是:
size_t count;
while ((count = fread(buf, 1, sizeof buf, file_ptr)) > 0)
{
    send(new_s, buf, count, 0);
}

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

关于c - 读取文件并通过套接字连接发送而不循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32960627/

10-16 11:54