Таблица на языке C
Можно ли реализовать такую таблицу на языке С?
Первая строчка задается автоматически, № тоже, а далее необходимо, чтобы пользователь вводил необходимую информацию. Я пробовал делать с табуляцией \t но все тщетно.
Вот собственно сам кусок кода:
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <conio.h>
struct library
{
char LastNAME[100];
char FirstNAME[100];
char MiddleNAME[100];
int BirthDate, BirthMonth, BirthYear;
char Address[100];
int PhoneNumberMOBILE;
int PhoneNumberWORK;
}notebook[10];
void DataInitialization() //Инициализация данных
{
FILE* F;
char fname[100];
int NumberOfEntries=0;
printf("Укажите имя файла, в котором будет хранится база данных (как на примере: text.txt)\n-> ");
scanf_s("%s", fname, sizeof(fname));
while (getchar() != '\n');
if ((F = fopen(fname, "w+")) == NULL)
{
printf("Невозможно открыть для чтения файл \n");
return;
};
printf("Сколько записей вы хотите сделать?\n -> ");
scanf_s("%d", &NumberOfEntries); //ЗАМЕНИТЬ ПЕРЕМЕННУЮ
printf("№ | Фамилия | Имя | Отчество | Дата Рождения | Адрес | моб.телефон | раб.телефон |\n");
/*while (1)
{*/
for (int i = 1; i <= NumberOfEntries; i++)
{
/*if (_getch() == 27) break;*/
printf("%2.d|", i);
}
/*}*/
}
void ViewData() //Просмотр существующей базы данных
{
}
void DataEdit() //Редактирование базы данных
{
}
void AddData() //Дополнение базы данных новыми записями
{
}
void DeleteData() //Удаление данных
{
}
void SearchData() //Поиск в базе данных
{
}
void SortData() //Сортировка данных по заданному полю
{
}
int main()
{
setlocale(LC_ALL, "Russian");
int menu=1;
while (menu != 0)
{
printf("Выберите, что вам нужно сделать\n"
"0 -> Выход из программы\n"
"1 -> Создание новой базы данных\n"
"2 -> Просмотр существующей базы данных\n"
"3 -> Редактирование базы данных\n"
"4 -> Дополнение базы данных новыми записями\n"
"5 -> Удаление записей из базы данных\n"
"6 -> Поиск в базе данных\n"
"7 -> Сортировка данных по заданному полю\n");
scanf_s("%d", &menu);
if (menu > 7)
printf("Пж выберите цифру из предложенного списка:\n\n");
switch (menu)
{
case 1:
DataInitialization();//Инициализация данных
break;
case 2:
ViewData(); //Просмотр существующей базы данных
break;
case 3:
DataEdit(); //Редактирование базы данных
break;
case 4:
AddData(); //Дополнение базы данных новыми записями
break;
case 5:
DeleteData(); //Удаление данных
break;
case 6:
SearchData(); //Поиск в базе данных
break;
case 7:
SortData(); //Сортировка данных по заданному полю
break;
}
}
}```
Ответы (2 шт):
Ответ: можно. С помощью модификаторов форматированной строки (Подробнее) можно организовать ширину полей. К примеру:
printf("№ | Фамилия | Имя | Отчество | Дата Рождения | Адрес | моб.телефон | раб.телефон |\n");
printf("%-2d| %-9s | %-5s | %-10s | %02d.%02d.%04d | %-7s | %-11d | %-11d |\n", 5, "Ivanov", "Ivan", "Ivanovich", 18, 8, 2020, "Moscow", 100 , 5555);
Цифры перед спецификаторами указывают на ширину отведённого под строку поля, знак - производит выравнивание по левому краю.
когда вписываю фамилию, она сразу перескакивает на следующую строчку.
Разумеется, именно так и должно быть. Дело в том, что собственно передача данных с клавиатуры в Вашу программу выполняется драйвером ОС только после того, как Вы нажали Enter. И то - не сразу. Сначала драйвер пытается откорректировать то, что Вы (возможно) правили клавишей "Забой" или как-то ещё. И только потом передаёт всю строку в программу.
Поэтому, при вводе сложных данных (как у Вас) есть только два варианта:
- Вводить сразу всю строку и уже внутри программы самостоятельно разбирать её на элементы и выполнять присваивания элементам данных;
- Вводить данные поэлементно, а красивую табличку печатать по окончанию ввода.
@andreymal рекомнендует Вам использовать ncurses. Да, для такой задачи - подходящий инструмент. Но, боюсь, что для начинающего это будет тяжело...
