0

我正在尝试创建一个简单的服务器,它可以连接到许多客户端,并从传递到服务器的文件中返回一个引号(两行)。我在连接客户端和服务器或打开文件方面没有遇到任何问题,但我在尝试一次获取两行时遇到了一些麻烦。每次客户端请求报价时,服务器应该从文件中读取接下来的两行并将它们发送给客户端。当服务器到达文件的末尾时,它应该重置回文件的顶部。谁能帮我解决这个问题?

更新:这是我目前正在做的一次获取两行的操作,我只是不确定如何检查它是否在文件末尾,如果是,请返回文件顶部。有什么帮助吗?

line 是我发送的字符数组,einstein 是我正在读取的打开文件。

i=0;
while (i<2)
{
    char temp[256] ;
    fgets(temp, sizeof(temp), einstein) ;
    strcat(line, temp) ;
    i++;
}

send(sock, line, strlen(line), 0 ); /* write the line */

strcpy(line, "") ;

谢谢!

4

2 回答 2

1

您可以使用简单的辅助函数:

char *read_next_line(char *buffer, size_t size, FILE *file)
{

   if (fgets(buffer, size, file))
   {
       return buffer;
   }
   // error or EOF
   if (!feof(file)) return NULL; // error
   fseek(file, 0, SEEK_SET);
   return fgets(buffer, size, file);
}

该函数尝试读取该行,如果失败,它会尝试重新定位流并再次读取。

所以代码看起来像:

FILE *list = fopen("config.txt", "r"); 
char line[1024];

if (read_next_line(line, sizeof(line), list)
{
    send(sock, line, strlen(line), 0);
    if (read_next_line(line, sizeof(line), list)
    {
       send(sock, line, strlen(line), 0);
    }
}

替代方案可能如下所示:

FILE *list = fopen("config.txt", "r"); 
char line[2048]; // buffer for 2 lines

if (read_next_line(line, sizeof(line), list)
{
    size_t len = strlen(line)
    if (read_next_line(line + len, sizeof(line) - len, list)
    {
       send(sock, line, strlen(line), 0);
    }
}
于 2013-05-04T23:08:47.080 回答
0

a) 在关闭文件之前,使用 fseek 回到文件顶部。

int fseek(FILE *stream, long offset, int wherece);

b)将文件保存在内存中的缓冲区中以便稍后发送?

于 2013-05-04T22:41:17.503 回答