このプログラムは、パイプで区切られたファイルを構造体の配列に読み込むことを想定しています。パイプ区切りファイル*を構造体の配列に読み込むC
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN_LINE 160
#define LEN_NAME 40
#define MAX_LINES 60
#define LEAGUE_NAME 5
#define PARK_NAME 35
#define TEAM_ADDRESS 40
#define TEAM_CITY 30
#define TEAM_STATE 5
#define ZIP_CODE 10
#define PHONE_NUMBER 30
#define WEB_ADDRESS 25
#define LEN_TEAM 60
typedef struct
{
char leagueName[LEAGUE_NAME + 1];
char teamName[LEN_NAME + 1];
char parkName[PARK_NAME + 1];
char teamAddress[TEAM_ADDRESS + 1];
char teamCity[TEAM_CITY + 1];
char teamState[TEAM_STATE + 1];
char zipCode[ZIP_CODE + 1];
char phoneNumber[PHONE_NUMBER + 1];
char webAddress[WEB_ADDRESS + 1];
} team_t;
void displayTeams(team_t teams[], int count);
int main(void)
{
team_t teams[LEN_TEAM] = { 0 };
FILE *filePtr;
int index, count;
char line[LEN_LINE + 1] = {0};
char *startPtr, *endPtr;
filePtr = fopen("MLBteams.txt", "r");
if (filePtr == NULL)
{
printf("Error in opening file\n");
}
else
{
index = 0;
while (index < LEN_TEAM && fgets(line, sizeof(line), filePtr))
{
startPtr = line;
endPtr = strchr(startPtr, '|');
strncpy(teams[index].leagueName, startPtr, endPtr - startPtr);
startPtr = endPtr + 1;
endPtr = strchr(startPtr, '|');
strncpy(teams[index].teamName, startPtr, endPtr - startPtr);
startPtr = endPtr + 1;
endPtr = strchr(startPtr, '|');
strncpy(teams[index].parkName, startPtr, endPtr - startPtr);
startPtr = endPtr + 1;
endPtr = strchr(startPtr, '|');
strncpy(teams[index].teamAddress, startPtr, endPtr - startPtr);
startPtr = endPtr + 1;
endPtr = strchr(startPtr, '|');
strncpy(teams[index].teamCity, startPtr, endPtr - startPtr);
startPtr = endPtr + 1;
endPtr = strchr(startPtr, '|');
strncpy(teams[index].teamState, startPtr, endPtr - startPtr);
startPtr = endPtr + 1;
endPtr = strchr(startPtr, '|');
strncpy(teams[index].zipCode, startPtr, endPtr - startPtr);
startPtr = endPtr + 1;
endPtr = strchr(startPtr, '|');
strncpy(teams[index].phoneNumber, startPtr, endPtr - startPtr);
startPtr = endPtr + 1;
endPtr = strchr(startPtr, '|');
strncpy(teams[index].webAddress, startPtr, endPtr - startPtr);
index++;
}
fclose(filePtr);
count = index;
displayTeams(teams, count);
}
return 0;
}
void displayTeams(team_t teams[], int count)
{
int index;
for (index = 0; index <= count - 1; index = index + 1)
{
printf("LEAGUE: %s\nTEAM: %s\nPARKNAME: %s\nADDRESS: %s\nCITY: %s\nSTATE: %s\nZIPCODE: %i\nPHONE#: %s\nWEBADDRESS: %s\n\n",
teams[index].leagueName, teams[index].teamName, teams[index].parkName,
teams[index].teamAddress, teams[index].teamCity, teams[index].teamState,
teams[index].zipCode, teams[index].phoneNumber, teams[index].webAddress);
}
}
このファイルを試してみるために使用しています。
A|Baltimore Orioles|Oriole Park|333 West Camden Street|Baltimore|MD|21201|(410) 685-9800|orioles.com
A|Boston Red Sox|Fenway Park|4 Yawkey Way|Boston|MA|02215|(617) 267-9440|redsox.com
N|St. Louis Cardinals|Busch Stadium|700 Clark Street|St. Louis|MO|63102|(314) 345-9600|cardinals.com
N|Washington Nationals|Nationals Park|1500 South Capitol Street, SE|Washington|DC|20003-1507|(202) 675-6287|nationals.com
ここにはいくつかの行(合計30チーム)があります。まあ私はプログラムを実行すると、すぐにクラッシュし、エラーメッセージが表示されません。私は誰かが私になぜコードが動作していない理由を説明することができれば感謝します。私は間違ってstrncpy機能を使用していると思います。
デバッガで実行して、 'line'と他の変数がどのように見えるかを確認しましたか?あるいは単に値を 'stdout'に出力したでしょうか? –