Передача и чтение файлов через функции
Я не очень опытный в 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);
Но когда я попытался запустить программу, это дало мне ошибку сегментации. Куда я иду не так?