Добавил:
Kaz
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include "stdafx.h"
#pragma comment(lib, "PhoneDB.lib")
#define BUFFER_SIZE 2048
const char g_program_name[] = "convertbase";
int convert_base(const char *inputfname, const char *outputfname);
char *strsplit(char *strToSplit, const char *delim, char *resultDelimPtr)
{
static char *beginOfToken = NULL;
static char *endOfToken = NULL;
static char savedChar;
static int isCharSaved = FALSE;
if (isCharSaved) {
*endOfToken = savedChar;
isCharSaved = FALSE;
beginOfToken = endOfToken;
}
if (delim == NULL)
return NULL;
if (strToSplit != NULL)
beginOfToken = strToSplit;
else
beginOfToken = endOfToken + 1;
endOfToken = strpbrk(beginOfToken, delim);
if (endOfToken) {
savedChar = *endOfToken;
if (resultDelimPtr)
*resultDelimPtr = savedChar;
isCharSaved = TRUE;
*endOfToken = '\0';
} else if (resultDelimPtr)
*resultDelimPtr = '\0';
return beginOfToken;
}
void usage(int exit_code)
{
fprintf(stderr, "Usage:\n"
" %s INPUTFILE OUTPUTFILE\n",
g_program_name);
exit(exit_code);
}
int main(int argc, char* argv[])
{
if (argc != 3)
usage(EXIT_FAILURE);
__try {
convert_base(argv[1], argv[2]);
//convert_base("telbase.txt", "database");
} __except(EXCEPTION_ACCESS_VIOLATION) {
puts("Got error: EXCEPTION_ACCESS_VIOLATION");
}
return EXIT_SUCCESS;
}
int convert_base(const char *inputfname, const char *outputfname)
{
char buffer[BUFFER_SIZE];
FILE *inputf, *outputf;
inputf = fopen(inputfname, "rt");
if (inputf == NULL)
return EXIT_FAILURE;
outputf = fopen(outputfname, "wt");
if (outputf == NULL) {
fclose(inputf);
return EXIT_FAILURE;
}
fseek(inputf, 0, SEEK_END);
long endOffset = ftell(inputf);
if (endOffset == 0) {
puts("Input file is empty!");
return EXIT_FAILURE;
}
long showProgressEveryBytes = endOffset/100;
int progressInfoShowedNTimes = 0;
fseek(inputf, 0, SEEK_SET);
while (fgets(buffer, BUFFER_SIZE, inputf)) {
PHONE_DB_RECORD tmp_record, record;
//0
char *tok = strsplit(buffer, ";\n", NULL);
strncpy(tmp_record.phone, tok, PHONE_DB_PHONE_LEN);
tmp_record.phone[PHONE_DB_PHONE_LEN-1] = '\0';
//1
tok = strsplit(NULL, ";\n", NULL);
strncpy(tmp_record.house, tok, PHONE_DB_HOUSE_LEN);
tmp_record.house[PHONE_DB_HOUSE_LEN-1] = '\0';
//2
tok = strsplit(NULL, ";\n", NULL);
strncpy(tmp_record.apartment, tok, PHONE_DB_APARTMENT_LEN);
tmp_record.apartment[PHONE_DB_APARTMENT_LEN-1] = '\0';
//3
tok = strsplit(NULL, " \n", NULL);
//4
tok = strsplit(NULL, ";\n", NULL);
strncpy(tmp_record.lastname, tok, PHONE_DB_LASTNAME_LEN);
tmp_record.lastname[PHONE_DB_LASTNAME_LEN-1] = '\0';
//5
tok = strsplit(NULL, ";\n", NULL);
BOOL namePatronymParsed = FALSE;
if (*tok != '\0') {
namePatronymParsed = TRUE;
char buffer2[BUFFER_SIZE]; //contains 'name patronym'
strcpy(buffer2, tok);
//6
char delimFound;
char *name = strsplit(buffer2, "; \n", &delimFound);
strncpy(tmp_record.name, name, PHONE_DB_NAME_LEN);
tmp_record.name[PHONE_DB_NAME_LEN-1] = '\0';
if (delimFound == ' ') {
//7
char *patronym = strsplit(NULL, " ;\n", &delimFound);
strncpy(tmp_record.patronym, patronym, PHONE_DB_PATRONYM_LEN);
tmp_record.patronym[PHONE_DB_PATRONYM_LEN-1] = '\0';
} else {
tmp_record.patronym[0] = '\0';
}
strsplit(NULL, NULL, NULL);
} else {
/*
strncpy(tmp_record.name, "unknown", PHONE_DB_NAME_LEN);
tmp_record.name[PHONE_DB_NAME_LEN-1] = '\0';
strncpy(tmp_record.patronym, "unknown", PHONE_DB_PATRONYM_LEN);
tmp_record.patronym[PHONE_DB_PATRONYM_LEN-1] = '\0';
*/
tmp_record.name[0] = '\0';
tmp_record.patronym[0] = '\0';
}
//8
if (namePatronymParsed) {
tok = strsplit(tok, ";\n", NULL);
tok = strsplit(NULL, ";\n", NULL);
} else
tok = strsplit(NULL, ";\n", NULL);
strncpy(tmp_record.street, tok, PHONE_DB_STREET_LEN);
tmp_record.street[PHONE_DB_STREET_LEN-1] = '\0';
strncpy(tmp_record.housing, "42", PHONE_DB_HOUSING_LEN);
tmp_record.housing[PHONE_DB_HOUSING_LEN-1] = '\0';
strsplit(NULL, "\n", NULL);
strsplit(NULL, NULL, NULL);
FillDatabaseRecord(&record,
tmp_record.phone,
tmp_record.lastname,
tmp_record.name,
tmp_record.patronym,
tmp_record.street,
tmp_record.house,
tmp_record.housing,
tmp_record.apartment);
//fwrite(&record, sizeof(record), 1, outputf);
fputs(record.phone, outputf); fputc(';', outputf);
fputs(record.lastname, outputf); fputc(';', outputf);
fputs(record.name, outputf); fputc(';', outputf);
fputs(record.patronym, outputf); fputc(';', outputf);
fputs(record.street, outputf); fputc(';', outputf);
fputs(record.house, outputf); fputc(';', outputf);
fputs(record.housing, outputf); fputc(';', outputf);
fputs(record.apartment, outputf);
fputc('\n', outputf);
long currOffset = ftell(inputf);
if (currOffset > (showProgressEveryBytes * progressInfoShowedNTimes)) {
system("cls");
printf("%d%%\n", progressInfoShowedNTimes++);
}
}
return EXIT_SUCCESS;
}
Соседние файлы в папке database_converter