一次从文件中读取两行

时间:2013-05-04 22:36:12

标签: c client-server fopen fgets

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

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

line是我发送的字符数组,爱因斯坦是我正在阅读的打开文件。

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, "") ;

谢谢!

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

A) 在关闭文件之前,请使用fseek查找文件的顶部。

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

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

相关问题