2016-02-22 69 views
2

我是編程新手,我正在開發一個從應用程序中獲取數據的C應用程序。我打開並分析這個外部文件的每一行。 循環內部我使用了一個解析器函數,我之前創建這個函數是爲了獲得所需的數據並解析它。在while循環中使用strcpy,C

這是行之有效的,但現在我需要將每個解析的行(每個消息)保存在另一個名爲buffer的數組中。 每條消息被限制爲200個字符並緩衝到1000個字符,因此緩衝區陣列中可以存儲5條消息。 我的外部文件有超過5條消息,所以當第6條消息到達時,第1條消息應該從緩衝區中刪除。 我在這裏遇到問題,因爲我不知道如何將值存儲在緩衝區中而不覆蓋它。

這是主要的功能:

void main(void) { 

     FILE *fp = fopen ("file","r"); //open file 
    char line[200]; 
    char parsed_line[200]; 
    char *message; 
    char buffer [1000]; 

    if (fp==NULL) printf ("the file open was not succeed"); 
    else{ 
     printf ("Device open!"); 

     while(fscanf (fp, "%s", line) > 0){ 

       if(strstr(line, "$GPRMC")){ 

       message = parser(line, parsed_line); //gets a line and parse it 
       strcpy(buffer, message); 
      } 
     } 
    } 
     return; 
    } 

我將不勝感激,如果有人能幫助我。

+2

這是C,所以使用'int main'而不是'void main'。 –

+0

如果你使用memcpy(),它會更好,因爲它需要起點和長度。通過這種方式,您可以非常輕鬆地管理自己的記憶 – sam

+0

爲什麼每個人都建議複製信息?一個5個指針數組有什麼問題?該消息作爲指針返回,大概是分配給malloc的struct/array,爲什麼不直接旋轉指針呢?爲什麼一遍又一遍批量複製數據?這是一個錯誤的C++問題嗎? :) –

回答

1

按照註釋中的建議很容易使用2D char數組,如下所示可以更改循環。

char buffer[5][201]; 

msgcount = 0; 
while(...) 
{ 
    ... 
    strcpy(buffer[msgcount], message); 
    if((++msgcount) >= 4) 
     msgcount = 0; 
    ... 
} 

OR

while(...) 
{ 
    ... 
    parser(line, buffer[msgcount]); 
    if((++msgcount) >= 4) 
    msgcount = 0; 
} 

這裏的缺點是該陣列的尺寸是固定的。如果以後要更改字符串數 ,則可以定義具有固定大小字符串的char指針數組。如果您不確定字符串大小和緩衝區大小,那麼您可以使用char **數據類型,然後分配內存。

0

代碼中的問題與strcpy。 寫它的方式,每條消息都會寫入緩衝區的開始,覆蓋以前的消息。 strcpy也會複製一個以空字符結尾的字符串,這意味着您需要以某種方式保留每個消息的大小以便從緩衝區讀取它們。 相反,你可以使用memcpy,每次你可以複製200個字符。所以,如果你的消息是空終止的,你就知道它們在緩衝區內的開始和結束位置。 (這也意味着,如果你的消息是200個字符未包括\0,緩衝區應該是1004個字符長)

void main(void) { 

     FILE *fp = fopen ("file","r"); //open file 
    char line[200]; 
    char parsed_line[200]; 
    char *message; 
    char buffer [1000]; 

    if (fp==NULL) printf ("the file open was not succeed"); 
    else{ 
     printf ("Device open!"); 

     int message_number = 0; 
     while(fscanf (fp, "%s", line) > 0){ 

       if(strstr(line, "$GPRMC")){ 

       message = parser(line, parsed_line); //gets a line and parse it 
       memcpy(buffer + 200*message_number, message, 200); 

       message_number = (message_number+1) % 5; 

       if (message_number == 4){ 
        //flush the buffer 
       } 
      } 
     } 
     fclose(fp); 
    } 
     return; 
    } 

我現在用的最多200個字符在緩衝區中的每個消息,讓你從緩衝區讀取時不需要保持每個人的大小。

+0

請避免僅給出代碼答案。 – user694733

+0

解釋你寫的東西。 –

+0

仍在編輯:) – Cantfindname