Передача и чтение файлов через функции

Я не очень опытный в C, поэтому любая помощь будет оценена, вопрос довольно длинный, но я не знаю другого способа выразить это действительно...

Я читаю данные из моего файла GPX, который выглядит следующим образом

   <trk>
  <trkseg>
  <trkpt lat="53.293629000" lon="-6.179304000"><ele>22.0</ele><time>2015-11-22T08:54:34Z</time></trkpt>
  <trkpt lat="53.293591000" lon="-6.179352000"><ele>22.0</ele><time>2015-11-22T08:54:59Z</time></trkpt>
  </trkseg>
  <trkseg>
  <trkpt lat="53.293660000" lon="-6.179425000"><ele>22.0</ele><time>2015-11-22T08:56:46Z</time></trkpt>
  <trkpt lat="53.293673000" lon="-6.179501000"><ele>22.0</ele><time>2015-11-22T08:56:56Z</time></trkpt>
  <trkpt lat="53.293674000" lon="-6.179505000"><ele>22.0</ele><time>2015-11-22T08:56:57Z</time></trkpt>
  </trkseg>
  <trkseg>
  <trkpt lat="53.293765000" lon="-6.179511000"><ele>21.3</ele><time>2015-11-22T08:57:14Z</time></trkpt>
  <trkpt lat="53.293862000" lon="-6.179512000"><ele>21.4</ele><time>2015-11-22T08:57:18Z</time></trkpt>
  ...
  </trkseg>
  </trk>

Я написал программу, в которой я могу извлечь данные между каждым из trksegОднако он работает только для первого сегмента трека и не учитывает несколько сегментов.

int lineNum = 0;
char theLine[120];
char prevLine[120];

char startOfTrk[10] = "<trk>";
char endOfTrk[10] = "</trk>";

char startOfData[10] = "<trkseg>";

char endOfHdr[10] = "<trkseg>";
char endOfData[10] = "</trkseg>";

      while (fgets(theLine, sizeof(theLine), fpn) && ((strncmp(theLine, startOfData,7) != 0)))
                    {
                        //Skip through the file until "<trkseg>" is reached (startOfData).

                        lineNum++;

                       // Extract data, etc. etc.

                    }

Моя идея заключается в том, что я могу вызывать функцию каждый раз, когда нахожу строку, содержащую <trkseg> но я не уверен, как передать указатель файла через него в качестве аргумента. Я создал функцию readSegment с этим прототипом:

void readSegment(FILE *fpn, int *lineNum){

    int newLineNum = * lineNum;

    char theLine[120];
    char prevLine[120];

    char startOfTrk[10] = "<trk>";
    char endOfTrk[10] = "</trk>";

    char startOfData[10] = "<trkseg>";

    char endOfHdr[10] = "<trkseg>";
    char endOfData[10] = "</trkseg>";


    char *timeStrPtr;
    char tempTimeStr[30];

    char *restTimeStrPtr;
    char tempRestTimeStr[30];

    double my_ele;

    int trackfound = 0;
    int segmentfound = 0;
    int delayTime;

    struct tm finishSegTm, startNewSegTm;

    int num_segments;


    // Read the text data and store the lat, lon, ele and time data in a linked list.
    // As long as the line isn't the end of a track segment
    // And while the line isn't the end of the track "</trk>"

    // keep a track of previous line with
    //      strcpy(prevLine, theLine);
    // before fgets-ing the next line
    // old :            && fgets(theLine, sizeof(theLine), fpn) && ((strncmp(theLine, endOfData,9) != 0))

        while ( strcpy(prevLine, theLine) && fgets(theLine, sizeof(theLine), fpn) && (strncmp(theLine, endOfTrk,5) != 0))
                        //finish when "</trk>" reached (endOfData)
                    {

                    //  printf("%s \n", prevLine);

                        if(strncmp(theLine, endOfData,9) == 0 ){

                            // if this line is the end of the track segment
                            // save the time data from the previous line

                            restTimeStrPtr = readStringAfterToken(theLine, "<time>",tempRestTimeStr, 20, 6);
                            timeStrPtr = readStringAfterToken(theLine, "<time>",tempTimeStr, 20, 6);

                            finishSegTm = * timeStructFromString(restTimeStrPtr, &finishSegTm);
                            startNewSegTm = * timeStructFromString(timeStrPtr, &startNewSegTm);

                            delayTime = timeDiff( &finishSegTm, &startNewSegTm );

                            //printf("Delay: %d", delayTime);



                        }
                        else{
                            // printf("Delay: 0\n");
                        }



                        timeStrPtr = readStringAfterToken(theLine, "<time>",tempTimeStr, 20, 6);

                        add_to_list(
                                readDoubleAfterToken(theLine, "lat=",5),
                                readDoubleAfterToken(theLine, "lon=",5),
                                readDoubleAfterToken(theLine, "<ele>",5),
                                timeStrPtr);

                        lineNum++;

                    }

// send lineNum back
        * lineNum =  newLineNum;

}

и назвал это с помощью

readSegment(fpn, &lineNum);

Но когда я попытался запустить программу, это дало мне ошибку сегментации. Куда я иду не так?

0 ответов

Другие вопросы по тегам