2013-05-04 111 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); 
    } 
}