2013-04-01 82 views
1

我在我的程序中創建了一個文本文件,其中保存了連接到我的服務器的客戶端的IP地址和端口號。每隔30秒後,我想從文本文件中讀取客戶端的IP和端口號,向該客戶端發送一些數據,等待回覆,讀取第二個客戶端的IP和端口號,等等客戶端。使用Win32 API逐行讀取文本文件

我做了什麼:

fgets (line, sizeof line, fp); /* read a line */ 
{ 
    MessageBox(NULL, 
       line, 
       "First Line of File", 
       MB_ICONINFORMATION); 
} 
fp=fp++; //move to the next line 
fgets (line, sizeof line, fp); /* read a line */ 
{ 
    MessageBox(NULL, 
       line, 
       "Second Line of File", 
       MB_ICONINFORMATION); 
} 

在執行上面的代碼中,第一行和第二行從文本文件中讀取是相同的。

我的文本文件看起來像這樣:

10.0.1.25 
56732 

10.0.1.25 
56733 

10.0.1.25 
56733 

10.0.1.25 
56733 
+2

什麼ü試過? –

+0

編輯我的答案:) – Ayse

回答

2

得到更多的東西,你必須從你的代碼

fp=fp++; //move to the next line 

fgets()功能自動移動的讀取文件中的位置到下一行刪除此行

要讀取和分割文件的數據(IP +端口),我建議您使用fscanf()代替o ˚Ffgets()

例如:

char ip[16]; 
int port; 

while (fscanf(fp, " %s %d", ip, &port) > 0) { 
    printf("ip: %s, port: %d", ip, port); 
} 
+0

謝謝,它工作:) – Ayse

+0

不客氣 – MOHAMED

1

我的建議:strtok削減每一行。第一部分是ip,第二部分是端口。

fgets以文本形式讀取您的文件。和你誤用fgets,當讀取同一個文件時,不需要改變第fgets的第三個參數,你可以循環調用它,直到它返回NULL。每次你調用fgets時,使用strtok來削減讀取行(細節使用strtok請google strtok)。

+0

我應該讀取我的整個文本文件中的字符串,然後使用strtok來分開IP和端口? – Ayse

+1

@AyeshaHassan,我已經更新了我對您問題的回答 – MYMNeo

1

您可以使用此代碼從文件中獲取行。現在你可以按照你的要求解析它。

#include <stdlib.h> /* exit, malloc, realloc, free */ 
#include <stdio.h> /* fopen, fgetc, fputs, fwrite */ 

struct line_reader { 
    /* All members are private. */ 
    FILE *f; 
    char *buf; 
    size_t siz; 
}; 

/* 
* Initializes a line reader _lr_ for the stream _f_. 
*/ 
void 
lr_init(struct line_reader *lr, FILE *f) 
{ 
    lr->f = f; 
    lr->buf = NULL; 
    lr->siz = 0; 
} 

/* 
* Reads the next line. If successful, returns a pointer to the line, 
* and sets *len to the number of characters, at least 1. The result is 
* _not_ a C string; it has no terminating '\0'. The returned pointer 
* remains valid until the next call to next_line() or lr_free() with 
* the same _lr_. 
* 
* next_line() returns NULL at end of file, or if there is an error (on 
* the stream, or with memory allocation). 
*/ 
char * 
next_line(struct line_reader *lr, size_t *len) 
{ 
    size_t newsiz; 
    int c; 
    char *newbuf; 

    *len = 0;   /* Start with empty line. */ 
    for (;;) { 
     c = fgetc(lr->f); /* Read next character. */ 
     if (ferror(lr->f)) 
      return NULL; 

     if (c == EOF) { 
      /* 
      * End of file is also end of last line, 
     ` * unless this last line would be empty. 
      */ 
      if (*len == 0) 
       return NULL; 
      else 
       return lr->buf; 
     } else { 
      /* Append c to the buffer. */ 
      if (*len == lr->siz) { 
       /* Need a bigger buffer! */ 
       newsiz = lr->siz + 4096; 
       newbuf = realloc(lr->buf, newsiz); 
       if (newbuf == NULL) 
        return NULL; 
       lr->buf = newbuf; 
       lr->siz = newsiz; 
      } 
      lr->buf[(*len)++] = c; 

      /* '\n' is end of line. */ 
      if (c == '\n') 
       return lr->buf; 
     } 
    } 
} 

/* 
* Frees internal memory used by _lr_. 
*/ 
void 
lr_free(struct line_reader *lr) 
{ 
    free(lr->buf); 
    lr->buf = NULL; 
    lr->siz = 0; 
} 

/* 
* Read a file line by line. 
* http://rosettacode.org/wiki/Read_a_file_line_by_line 
*/ 
int 
main() 
{ 
    struct line_reader lr; 
    FILE *f; 
    size_t len; 
    char *line; 

    f = fopen("foobar.txt", "r"); 
    if (f == NULL) { 
     perror("foobar.txt"); 
     exit(1); 
    } 

    /* 
    * This loop reads each line. 
    * Remember that line is not a C string. 
    * There is no terminating '\0'. 
    */ 
    lr_init(&lr, f); 
    while (line = next_line(&lr, &len)) { 
     /* 
     * Do something with line. 
     */ 
     fputs("LINE: ", stdout); 
     fwrite(line, len, 1, stdout); 
    } 
    if (!feof(f)) { 
     perror("next_line"); 
     exit(1); 
    } 
    lr_free(&lr); 

    return 0; 
} 

你可以在http://rosettacode.org/wiki/Read_a_file_line_by_line

1

下面的while循環將盡讀部分

while (fgets(buffer, sizeof(buffer), fp)) 

一個嚴重的錯誤,我在我們的代碼看到被

fp = fp++;