Как связать файлы с функциями в простенькое приложение?

Автор blattodea, 17 марта 2024, 17:21:38

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

blattodea

Здравствуйте, товарищи комсомольцы! :)

Вопрос у меня, ну совершенно нубский. Как я уже писал, в программировании на С я совершенный дундук, но очень хочу себе простенькую программку для каталогизации ботанической коллекции и коллекции гербария. Есть такие приложения (они большая редкость), но они имеют излишний функционал и кушают чрезвычайно много ресурсов.

Мне нужно совсем немного, а именно:

— вывод из SQLite-файла общего списка строк (строка — номер в коллекции);
— поиск строк по критериям столбцов (а. по номеру, б. по латинскому названию, в. по роду и г. по семейству);
— просмотр данных номера;
— создание нового номера;
— редактирование номера;
— удаление номера;
— экспорт списка в PDF (это в идеале, безусловно, я на такое, собственно, слабо рассчитываю);

У меня есть Motif-мордашка и файлики с выводом из БД. Я уже потерял надежду прикрутить гуй к этим файликам, но хочется создать хотя бы консольное приложение. Что я имею ввиду под этим определением:

Запускаем программу, например:

plmaneger
Программа запускается и выводит так сказать, «man», где показывает как можно с ней взаимодействовать. Например, чтобы создать новый номер, нужно выполнить:

plmaneger> add
plmaneger> inter taxon: /* например, вводим Betula nana */
plmaneger> inter years: /* например, вводим 2024 */
plmaneger> inter source: /* например, вводим Главный ботанический сад им. Цицина (Москва) */

Как это можно реализовать?

Graf

Хоть на баше, хоть на СИсях.  :biggrin_mini:
Посылаешь SQl-запрос в базу, получаешь ответ и обрабатываешь его.
Но с твоими знаниями, как ты сказал, тебе будет множко не быстро.  :biggrin_mini:

blattodea

Цитата: Graf от 18 марта 2024, 10:23:08Хоть на баше, хоть на СИсях.  :biggrin_mini:
Посылаешь SQl-запрос в базу, получаешь ответ и обрабатываешь его.
Но с твоими знаниями, как ты сказал, тебе будет множко не быстро.  :biggrin_mini:

Да я понимаю, что очень множко :biggrin_mini:

Я вот почитал и получается вывести все строки:

#include <sqlite3.h>
#include <stdio.h>

int callback(void *, int, char **, char **);

int main(void) {

    sqlite3 *db;
    char *err_msg = 0;

    int rc = sqlite3_open("plants.db", &db);

    if (rc != SQLITE_OK) {

        fprintf(stderr, "Cannot open database: %s\n",
        sqlite3_errmsg(db));
        sqlite3_close(db);

        return 1;
    }

    char *sql = "SELECT id, number, familia, taxon FROM numbers";

    rc = sqlite3_exec(db, sql, callback, 0, &err_msg);

    if (rc != SQLITE_OK ) {

        fprintf(stderr, "Failed to select data\n");
        fprintf(stderr, "SQL error: %s\n", err_msg);

        sqlite3_free(err_msg);
        sqlite3_close(db);

        return 1;
    }

    sqlite3_close(db);

    return 0;
}

int callback(void *NotUsed, int argc, char **argv, char **azColName) {

    NotUsed = 0;

    for (int i = 0; i < argc; i++) {

    //printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    printf("%s    ", argv[i]);
    }

    printf("\n");

    return 0;
}

А вот как бы сделать так, чтобы после ./list функция не выполнялась, программа не закрывалась, но функцию можно было бы вызвать командой, например что-то вроде:

list> --output
2024 Moscow Botanical Garden Tillandsia purpurea
2024 privat collect. Lenungrad Tillandsia caput-medusae
2024 commer. Belgrad Aechmea recurvata var. recurvata
2024 Moscow Botanical Garden Billbergia magnifica
2024 Moscow Botanical Garden Pitcairnia xanthocalyx

Graf

Цитата: blattodea от 18 марта 2024, 15:52:57А вот как бы сделать так, чтобы после ./list функция не выполнялась, программа не закрывалась, но функцию можно было бы вызвать командой, например что-то вроде:

Считываешь с консоли строку, например fgets() и согласно этой строки вызываешь функцию.

blattodea

Цитата: Graf от 18 марта 2024, 16:23:50Считываешь с консоли строку, например fgets() и согласно этой строки вызываешь функцию.

Спасибо, попробую!)

blattodea

#5
А вот ещё нашёл вот это — scabf(), попробовал в своём скрипте, но сильно ругается и не работает, как и следовало ожидать. Вот моя писанина:

#include <sqlite3.h>
#include <stdio.h>

int main(void) {

sqlite3 *db;
char *err_msg = 0;

int rc = sqlite3_open("plants.db", &db);

if (rc != SQLITE_OK) {

fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);

return 1;
}

  char year[300];
  char source[300];
  char type[300];
  char familia[300];
  char taxon[300];
  char other[300];

printf("Enter year and press enter: \n");

scanf("%s", year);

printf("Enter sourse and press enter: \n");

scanf("%s", source);

printf("Enter type and press enter: \n");

scanf("%s", type);

printf("Enter familia and press enter: \n");

scanf("%s", familia);

printf("Enter taxon and press enter: \n");

scanf("%s", taxon);

printf("Enter other and press enter: \n");

scanf("%s", other);

char *sql = "INSERT INTO numbers (NULL, year, source, type, familia, taxon, other) VALUES (year, source, type, familia, taxon, other)";

rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
    if (rc != SQLITE_OK )
    {
        printf("SQL error: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return 1;
    }
    sqlite3_close(db);
    printf("data inserted\n");
    return 0;
}

Ну тут очевидна моя задумка — добавить в таблицу новую строку :) Graf, как можно сделать? Если я соображу на этом примере, я думаю, что и остальные скрипты смогу переписать как надо.

flanker

не морочьте голову ни себе ни другим. возмите книгу Шлее по Qt5, откройте главу 41 "программирование баз данных", читаете и делаете как там написано. на выходе получите приложение, кторое можно будет собрать как в линукс, так и венде.

blattodea

Цитата: flanker от 18 марта 2024, 18:49:50не морочьте голову ни себе ни другим. возмите книгу Шлее по Qt5, откройте главу 41 "программирование баз данных", читаете и делаете как там написано. на выходе получите приложение, кторое можно будет собрать как в линукс, так и венде.

Это руководство по C? Я бы не хотел учить Qt :)

flanker

ну-ну. посмотрю я на вас, когда объем кода превысит хотя бы три тысячи cтрок ;)

blattodea

Цитата: flanker от 18 марта 2024, 20:34:54ну-ну. посмотрю я на вас, когда объем кода превысит хотя бы три тысячи cтрок ;)

А что случится? :biggrin_mini: Просветите, пожалуйста :biggrin_mini:

flanker


blattodea

#11
Пока всё получается :)