Давайте начнем с очень простого подхода, который использует плоский файл для вашего хранилища и при каждом запросе циклически перебирает плоский файл, пытаясь сопоставить ваш key
с первым полем. Если совпадение найдено, просто используйте sscanf
для разделения значений (игнорируя 1-е поле, используя модификатор подавления назначения для вашего sscanf
спецификатора преобразования для этого поля, например, '*'
). Распечатайте значения. Если ключ не найден в файле, скажем так.
Используя fgets()
для ввода, вы можете просто принимать ввод, пока пользователь не нажмет Enter на пустой строке дляключ. (вы просто проверяете, является ли 1-ый символ '\n'
и, если это так, прерываете цикл).
Вы выполняете цикл непрерывно, чтобы разрешить выполнение нескольких ключевых запросов, используя rewind()
в начале каждого цикла длякаждый раз перематывайте к началу файла.
Собрав все вместе, вы можете сначала открыть и проверить ваш файл открыт для чтения.
#include <stdio.h>
#include <string.h>
#define MAXN 64 /* if you need a constand, #define one (or more) */
#define MAXC 1024 /* (don't skimp on buffer size) */
int main (int argc, char **argv) {
/* use filename provided as 1st argument ("flatfile.txt" by default) */
FILE *fp = fopen (argc > 1 ? argv[1] : "flatfile.txt", "r");
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
Теперь начните свой непрерывный цикл, который будет читать key
от пользователя, обрезать '\n'
с конца клавиши (вы не хотите это как часть сравнения),и получите длину ключа:
for (;;) { /* loop continually until [Enter] on empty line */
char buf[MAXC], name[MAXN], city[MAXN], key[MAXN];
unsigned salary, len, found = 0;
rewind (fp); /* rewind file to beginning */
fputs ("\nInput the primary key: ", stdout); /* prompt for key */
if (!fgets (key, MAXN, stdin) || *key == '\n') /* read key */
break;
key[strcspn (key, "\n")] = 0; /* trim '\n' */
len = strlen(key); /* get key length */
Получив эту информацию, переберите файл, читая каждую строку в буфер buf
, а затем используйте strcmp
для сравнения первых символов len
сваш key
, и если есть совпадение, распечатайте его и установите флаг found
и прервите цикл чтения файла. В конце, если found
не установлен, сообщите пользователю, что ключ не найден, теперь делайте это снова, пока пользователь не нажмет Ввод в одиночку в строке, запрашивая первичный ключ:
while (fgets (buf, MAXC, fp)) { /* read each line */
if (strncmp (buf, key, len) == 0) { /* compare key */
/* parse line into separate values, ignoring 1st key field */
if (sscanf (buf, "%*63[^|]|%63[^|]|%63[^|]|%u",
name, city, &salary) == 3) {
printf ("\nResult:\nName = %s\nAddress = %s\n"
"Salary = %u\n", name, city, salary);
found = 1; /* set flag indicating key found */
break; /* no sense in reading rest */
}
}
}
if (!found) /* if key not found, so indicate */
fputs ("\nResult: (not found)\n", stdout);
}
Осталось только закрыть входной файл. Полный пример:
#include <stdio.h>
#include <string.h>
#define MAXN 64 /* if you need a constand, #define one (or more) */
#define MAXC 1024 /* (don't skimp on buffer size) */
int main (int argc, char **argv) {
/* use filename provided as 1st argument ("flatfile.txt" by default) */
FILE *fp = fopen (argc > 1 ? argv[1] : "flatfile.txt", "r");
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
for (;;) { /* loop continually until [Enter] on empty line */
char buf[MAXC], name[MAXN], city[MAXN], key[MAXN];
unsigned salary, len, found = 0;
rewind (fp); /* rewind file to beginning */
fputs ("\nInput the primary key: ", stdout); /* prompt for key */
if (!fgets (key, MAXN, stdin) || *key == '\n') /* read key */
break;
key[strcspn (key, "\n")] = 0; /* trim '\n' */
len = strlen(key); /* get key length */
while (fgets (buf, MAXC, fp)) { /* read each line */
if (strncmp (buf, key, len) == 0) { /* compare key */
/* parse line into separate values, ignoring 1st key field */
if (sscanf (buf, "%*63[^|]|%63[^|]|%63[^|]|%u",
name, city, &salary) == 3) {
printf ("\nResult:\nName = %s\nAddress = %s\n"
"Salary = %u\n", name, city, salary);
found = 1; /* set flag indicating key found */
break; /* no sense in reading rest */
}
}
}
if (!found) /* if key not found, so indicate */
fputs ("\nResult: (not found)\n", stdout);
}
fclose (fp); /* close file */
}
Пример входного файла
$ cat dat/flatfile.txt
A0001|John|New York City|12000
A0002|Daisy|New Delhi|32000
A0003|Dany|London|23000
Пример использования / Вывод
$ ./bin/readflatfile dat/flatfile.txt
Input the primary key: A0002
Result:
Name = Daisy
Address = New Delhi
Salary = 32000
Input the primary key: A0003
Result:
Name = Dany
Address = London
Salary = 23000
Input the primary key: A0004
Result: (not found)
Input the primary key:
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.