2013-05-04 105 views
0

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

更新:这就是我目前在做一次拿到两行,我只是不知道如何来检查它是否在文件末尾,如果是这样,回到文件的顶部。对此有何帮助?

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

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

谢谢!

+1

你有未使用的代码? – Bill 2013-05-04 22:37:57

+0

是的,请提供一个SSCCE(http://sscce.org/) – 2013-05-04 22:39:24

+0

我目前的代码返回一些随机数量的行,并且我知道它不应该这样工作,我只是不确定如何完成它工作,但我会添加我指的部分 – arc 2013-05-04 22:41:42

回答

0

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

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

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

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); 
    } 
}