我正在尝试创建一个简单的服务器,它可以连接到许多客户端,并从传递到服务器的文件中返回一个引用(两行)。我在连接客户端和服务器或打开文件方面没有遇到任何问题,但我在尝试一次获取两行时遇到了一些麻烦。每次客户端请求引用时,服务器都应该从文件中读取下两行并将它们发送到客户端。当服务器到达文件末尾时,它应该重置回文件的顶部。任何人都可以帮我解决这个问题吗?
更新:这是我目前正在做的一次获得两行,我只是不确定如何检查它是否在文件末尾,如果是,请返回文件顶部。对此有何帮助?
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, "") ;
谢谢!
答案 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)将文件保存在内存缓冲区中以便稍后发送?