在while循环中使用strcpy,C

时间:2016-02-22 11:27:50

标签: c

我是编程新手,我正在开发一个从文件中获取数据的C应用程序。我打开并分析这个外部文件的每一行。 在循环内部,我使用我之前创建的解析器函数,以获取所需的数据并解析它。

这很好但现在我需要在另一个名为buffer的数组中保存每条已解析的行(每条消息)。 每条消息限制为200个字符并缓冲到1000个字符,因此在缓冲区数组中可以存储5条消息。 我的外部文件有超过5条消息,因此当第6条消息到达时,应从缓冲区中删除第一条消息。 我在这里遇到问题,因为我不知道如何在不覆盖缓冲区的情况下将值存储在缓冲区中。

这是主要功能:

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 个答案:

答案 0 :(得分: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 **数据类型然后分配内存。

答案 1 :(得分: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个字符,因此当您从缓冲区中读取时,不需要保留每个字符的大小。