#arrays #c #struct #structure #strtok
#массивы #c #struct #структура #strtok
Вопрос:
думаю, мне следует перефразировать свой вопрос. у меня есть структура, подобная приведенной ниже:
struct profile {
char name[30];
int age, phoneNo;
};
у меня есть файл со строками, которые выглядят следующим образом:
James Brown,35y,0123456789
Mary Brown,45y,0123987456
в настоящее время я написал код для поиска записи с использованием имени / возраста / phoneNo человека, и я хотел бы сохранить записи в структуре, которая у меня есть. я пытаюсь использовать strtok
для отделения данных от запятой, но мой код не работает.
int main()
{
char search[50];
char record[50];
const char s[2] = ",";
char* token;
struct profile c;
FILE* fPtr;
if (fPtr = fopen("profile.txt", "r"))
{
// flag to check whether record found or not
int foundRecord = 0;
printf("Enter name to search : ");
// fgets gets name to search
fgets(search, 50, stdin);
//remove the 'n' at the end of string
search[strcspn(search, "n")] = 0;
while (fgets(record, 50, fPtr))
{
// strstr returns start address of substring in case if present
if (strstr(record, search))
{
token = strtok(record, s);
while (strtok != NULL)
{
scanf("%s", c.name);
token = strtok(record, s);
scanf("%d", c.age);
token = strtok(record, s);
scanf("%d", c.phoneNo);
token = strtok(NULL, s);
printf("Your details: ");
printf("%s, %d, %dn", c.name, c.age, c.phoneNo);
}
foundRecord = 1;
}
}
if (!foundRecord)
printf("%s cannot be foundn", search);
fclose(fPtr);
}
else
{
printf("File cannot be openedn");
}
}
я никогда strtok
раньше не использовал, и я не уверен, как хранить каждый токен в каждой переменной структуры. может кто-нибудь объяснить мне, как я могу исправить strtok
функцию в своем коде?
Комментарии:
1. Прочитайте описание функции strtok . Вы можете найти его в Интернете.
2. @VladfromMoscow я читал о strtok в Интернете, но я не знаю, как применить его к структурам.
Ответ №1:
Как указано в комментариях, вы можете легко прочитать строку, разделенную запятыми, используя strtok
. Вы можете использовать atoi
/ sscanf
для извлечения целочисленного значения из age . Я немного изменил ваш код, чтобы читать из файла для назначения структурному массиву:
// Array for storing Profiles
struct profile profiles[2];
FILE* fPtr;
if (fPtr = fopen("profile.txt", "r")) {
int index = 0;
while (fgets(record, 50, fPtr) != NULL) {
// Extract name
char *pStr = strtok(record, ",");
if (pStr != NULL) {
strcpy(profiles[index].name, pStr);
}
// Extract Age
pStr = strtok(NULL, ",");
if (pStr != NULL) {
profiles[index].age = atoi(pStr);
}
// Extract Phone No
pStr = strtok(NULL, ",");
if (pStr != NULL) {
profiles[index].phoneNo = atoi(pStr);
}
index ;
}
for (int i = 0; i < 2; i ) {
printf("%s %d %dn", profiles[i].name, profiles[i].age, profiles[i].phoneNo);
}
fclose(fPtr);
}
Когда я запустил это, я смог увидеть ожидаемый результат:
src : $ cat profile.txt
James Brown,35y,0123456789
Mary Brown,45y,0123987456
src : $ gcc readfiletostructarr.c
src : $ ./a.out
James Brown 35 123456789
Mary Brown 45 123987456
Комментарии:
1. большое вам спасибо! это помогло мне получить представление о том, как strtok работает со структурами, и я уверен, что теперь я могу запрограммировать свой. я действительно ценю это, хорошего дня! 🙂
2. Np, я рад, что смог помочь 🙂