簡體   English   中英

用C進行文件解析

[英]File Parsing in C

我正在嘗試編寫基本的GPS解析器。 我一次要獲取一個字符的數據,然后將其放入一個字符數組,直到未檢測到CRLF。 但是,似乎我的字符數組一次關閉了。 也可以是字母[100],因為已知最大大小不超過100。另外,我要填寫垃圾字符“>”,因為我知道它不會成為GPS數據包的一部分。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void) {
       char ch;
       char letters[100];
       FILE *fp;
       int i=0;
       for( i=0; i<100; i++)
       {
           letters[i] ='>';
       }
       fp = fopen(" wont work in SO :) ","r"); // read mode
       if( fp == NULL )
       {
          printf("Error while opening the file.\n");
          exit(EXIT_FAILURE);
       }
       int pointer = 0;
       while( ( ch = fgetc(fp) ) != EOF )
       {
           if(ch == '\r' || ch == '\n')
           {
               printf("%c %c", letters[2], letters[3]);// I am trying to check the array correctness here
               pointer =0;
               for( i=0; i<100; i++)
               {
                   letters[i] ='>'; // reinitialising the array
               }

           }
           letters[pointer] = ch;
           pointer++;

       }

       fclose(fp);
       return 0;
}

這是GPS文本文件,其中包括來自

$GPGLL,4539.99781,N,11102.77595,W,210416.00,A,A*4
$GPRMC,210417.00,A,4539.99764,N,11102.77603,W,0.444,,280909,,,A*65
$GPVTG,,T,,M,0.444,N,0.822,K,A*2F
$GPGGA,210417.00,4539.99764,N,11102.77603,W,1,07,1.13,1516.1,M,-17.6,M,,*5C
$GGSA,A,3,26,27,09,02,28,17,12,,,,,,1.87,1.13,1.48*07
$GPGSV,4,1,13,02,17,190,18,04,40,169,11,09,47,292,35,11,04,042,*72
$GPGSV,4,2,13,12,16,296,22,14,01,345,,15,03,234,27,17,66,051,24*71
$GPGSV,4,3,13,20,11,069,2,0,323,26,27,53,277,36,28,34,105,19*7F
$GPGSV,4,4,13,32,06,044,21*4F
$GPGLL,4539.99764,N,11102.77603,W,210417.00,A,A*72
$GPRMC,210418.00,A,4539.99756,N,11102.77591,W,0.285,,280909,,,A*68
$GPVTG,,T,,M,0.285,N,0.527,K,A*2C
$GPGGA,210418.00,4539.99756,N,11102.77591,W,1,07,1.13,151.1,M,-17.6,M,,*5A
$GPGSA,A,3,26,27,09,02,28,17,12,,,,,,1.87,1.13,1.48*07
$GPGSV,4,1,13,02,17,190,19,04,40,169,08,09,47,292,35,11,04,042,*7B
$GPGSV,4,2,13,12,16,296,22,14,01,345,,15,03,234,27,17,66,051,23*76
$GPGS,43,13,20,11,069,,26,09,323,27,27,53,277,37,28,34,105,19*7F
$GPGSV,4,4,13,32,06,044,22*4C
$GPGLL,4539.99756,N,11102.77591,W,210418.00,A,A*74

Eclipse給我的輸出是

P G 
G P 
G P 
G P 
G G 
G P 
G P 
G P 
G P 
G P 
G P 
G P 
G P 
G P 
G P 
G P 
G P 
G P

如您所見,除了第一個輸出以外,其他所有行都相距一。

有人可以告訴我我在做什么錯嗎? 任何幫助將不勝感激。

您應該在if區域添加一個continue語句

if(ch == '\r' || ch == '\n')
{
 /* your code */
 continue;
}

因此,當您讀取下一行時,'\\ r'和'\\ n'不會分配給數組的開頭。

下一行從索引1開始,即:字母[1]而不是字母[0]。

int pointer = 0;
while( ( ch = fgetc(fp) ) != EOF )
  {
     if(ch == '\r' || ch == '\n')
     {
      printf("%c %c", letters[2], letters[3]);
      pointer =0;
      for( i=0; i<100; i++)
      {  
       letters[i] ='>';
       }
      }
     letters[pointer] = ch;
     if(ch != '\r' || ch != '\n')
       {
       pointer++;
       }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM