我是编程新手,我正在开发一个从文件中获取数据的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;
}
如果有人能帮助我,我将不胜感激。
答案 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个字符,因此当您从缓冲区中读取时,不需要保留每个字符的大小。