версия 1.0.0.0 (4-02-2012) - Comlib (СБС) - самописная библиотека Си
Primary tabs
Forums:
В первой версии библиотека выглядит так (не забудь подправить написание инклудов) =
/* это обобщенная самописная библиотека функций языка си - в дальнейшем я буду стараться расширять её)) если кто готов поделиться завершённой самостоятельной функцией - всегда пожалуйста - можете указать ссылку на свой блок и ваше имя - в комментария к заголовку функции - но не забывайте о тех ,кто учиться программировать - комментируйте код))*/ #include stdio.h> #include stdlib.h> #include "comlib.h" /*конструкция из трёх строк определит в какой операционной системе мы находимся*/ #if defined(_WIN32) || defined (_WIN64) #define IN_WINDOWS 1 #endif /*функция выполняыет Посторчное сравнение двумерных массивов в си (например строк, счиатнных из двух текстовых файлов) и выведет результат на экран*/ int tdarrs_cmp(char **arr1,char **arr2, FILE *rfp)/* функция сравнивает два двумерных массива с символами. си выводит результат сравнения в консоль и (дополнительно) в текстовый файл , указателем на который является третий аргумент*/ { /* */ int k=0; /* число строк - номер строки */ int n1=1; /* признак сущетвования для первого массива элемента с номером строки, меньше либо равным текущем k*/ int n2=1; /* признак сущетвования для второго массива элемента с номером строки, меньше либо равным текущем k*/ // putchar(k); //// /*ниже потратим десяток строк на проверку корректности переданных данных*/ if (!rfp) { printf("[(!)Warning= file pointer for tdarrs_cmp is NULL ]\n"); rfp=fopen("compRESULT.txt","w"); } if (!arr1) { printf("[(!)Warning= first array is NULL ! ]\n"); } if (!arr2) { printf("[(!)Warning= second array is NULL ! ]\n"); } printf("\n\n[%s]\n", "...comparation of two two-demision arrays showing is started..."); printf("===========\n"); fprintf(rfp,"=============\n"); while ((n1)||(n2)) { fprintf(rfp,"(%i)",k); // пишем номер строки в файл printf("(%i)",k); // пишем номер строки в консоль // putchar('('); putchar(k); printf(")\n");// пишем номер строки в консоль //fputc('(',rfp); fputc(k,rfp); fprintf(rfp,")\n"); // пишем номер строки в файл if ((n1)&&(*(*(arr1+k)))==EOF) n1=0;/* опускаем флаг присутствия в массиве строк при текущем значении k*/ if ((n2)&&(*(*(arr2+k)))==EOF) n2=0; /* опускаем флаг присутствия в массиве строк при текущем значении k*/ /* printf("[n1 = %i]", n1); printf("[n1 = %i]", n1); printf("[k = %i]", k); */ if ((n1==1)&&(n2==1)) { if (!(strcmp(*(arr1+k),*(arr2+k)))) printf(" (+)"); else printf(" (-)"); } else printf(" (-)"); if (n1) { printw(*(arr1+k),'\n'," | [","]"); // пишем в консоль fprintw(rfp,*(arr1+k),'\n'," | [","]"); // пишем в файл } else { printf(" | [__________]"); fprintf(rfp," | [__________]"); } if (n2) { printw(*(arr2+k),'\n'," | [","]"); // пишем в консоль fprintw(rfp,*(arr2+k),'\n'," | [","]"); // пишем в файл } else { printf(" | [__________]\n"); fprintf(rfp," | [__________]\n"); } fprintf(rfp,"\n-------------------------\n"); printf("\n---------------------\n"); k++; } printf("-----------\n"); fprintf(rfp,"-----------\n"); fclose(rfp); return 0; } /* функция выводит двумерный массив в виде последовательности строк в консоль - си функция*//* */ int tdarr_show(char **arr) {/* */ int n=0; /* число символов в текущей строке */ int i=0; /* номер текущего символа в текущей строке*/ int k=0; /* число строк - номер строки */ putchar('\n'); printf(" \n[%s]\n", "...two-demision array showing is started..."); // *(*(arr+10)+i) = '0'; while (*(*(arr+k)+i)!=EOF) { printf("%s", *(arr+k)); k++; } return 0; } /* сохранение текста(строки со всем текстом) из файла в виде двумерного массива символов (массива строк) char** = язык си функция*/ char** tfile_to_tdarr(FILE *fp) /*text file to two-dimensional array of char = c*/ { /* */ char** arr; int n=0; /* число символов */ int k=0; /* число знаков переноса строк строк */ int i=0; /* число символов в строке*/ char *strff; /*переменная в которую мы сохраним все сиволы файла в виде одномерного массива tfile_to_array */ int n2=0; /*длина текста файла*/ strff = full_file_r(fp, NULL, 5);/* считываем строку из переданного в */ /* printf("%s\n", strff); */ /* сначала посчитаем сколько у нас всего переносов символов в строке*/ printf("[%s]\n", "...text file conversion is started..."); while (*(strff+n)!='\0') { if (*(strff+n)=='\n') k++; else if(*(strff+n+1)=='\0') k++; n++; } arr = (char**)calloc(k+1,sizeof(char*)); /* выделяем память в массиве для указателней на k+1 строк - в последней мы в конце этой функции разместим единственный символ конца файла EOF*/ *(arr+k) = (char*)malloc(1); /* выделяем память для символа конца файла в единственной ячейке последней "строки" массива */ *(*(arr+k))=EOF; /*ЗАПИСЫВАЕМ СИМВОЛ КОНЦА ПОТОКА EOF В ПЕРВУЮ И ЕДИНСТВЕННУЮ ячейку последней строки нашего массива*/ printf("\n[%s = %i ]\n", "...number of lines had been found out", k+1); k=0; n=0; /* далее в цикле будем подсчитывать символы в каждой строке и выделять соответствующий объём памяти для строке массива*/ while (*(strff+n)!='\0') { i++; if (*(strff+n)=='\n') /*если мы встретили сиимвол переноса строки ,то....*/ { *(arr+k) = (char*)malloc(i+1); /*...выдеоляем память для этой строки , по числу символов + 1 для добавления стандартного '\0' , которые мы в ней встретили (вместе с символом конца строки)*/ // printf("[the %i line size = %i]\n", k, sizeof(*(arr+k))); i=0; /*...сбрасываем счётчик символов в конкретной строке - так как возможно мы перейдём к новой*/ k++; /*...наращиваем счётчик строк*/ } else if (*(strff+n+1)!='\0') *(arr+k) = (char*)malloc(i+1); n++; /* printf("[n = %i]", n); printf("[k = %i]", k); printf("[i = %i]", i); */ } if (k==0) *(arr+k) = (char*)malloc(i); /*сработает в случае если переносов строк в файле вообще не было*/ printf("\n[%s]\n", "...the quantity of symbols in file in each line had been found out..."); i=k=n=0; /* обнуляем все переменнные-счётчики */ /* теперь заполняем размеченный массив данными -третий раз читая всю исходную (переданную в функцию) строку*/ n2 += strlen(strff)-1; //printf("[strlength = %i]\n", n2+1); while (*(strff+n)!='\0') { /* printf("[n = %i]", n); printf("[k = %i]", k); printf("[i = %i]", i); */ *(*(arr+k)+i)=*(strff+n);/* сохраняем очередной символ текущей строки k*/ /* putchar(*(*(arr+k)+i)); */ if (*(strff+n)=='\n') /* если мы встретили символ переноса строки, то....*/ { *(*(arr+k)+i+1)='\0'; /*завершаем нашу строку спец символом*/ k++; /* увеличиваем счётчик строк*/ i=-1; /* сбрасываем счётчик символов в строке аж до -1 , т.к. последняя строка этого цикла как раз вернёт ноль*/ } else if (*(strff+n+1)!='\0') /*если последний значащий символ читаемого файла - это не знак переноса строки (мы можем понять , что текущий символ последний в считанном потоке по завершающему его спец символу '\0' добавленному функцией fgets()), то.....*/ *(*(arr+k)+i+1)='\0'; /*...то опять же завершаем последнюю строку нашего массива спецсимволом*/ n++; i++; } return arr; } FILE *openfilefor(FILE *fp,char *prompt, char *mode)/*функция открывает файл в си с выводом уведомлений */ { char filename[200]; /*место для указания пути выделяем с запасом*/ printf("[%s]\n", "...program waits for file name's specification..."); if (prompt) printf("[%s]\n", prompt); scanf(" %s",filename); /*считываем данные без пробелов (т.к. перед % есть пробел в строке формата)*/ inputcl(); if (fp=fopen(filename, mode)) { printf("___%s___\n", "file is open"); return fp; } else { printf("%s\n", "(!) Error = File openning was failed. "); return NULL; } } /*функция открывает файл и возвращает ошибку в случае если открыть не удалось (где напишет какой именно файл не удалось открыть)*/ FILE *openfileforme (char *fn , char *mode) { FILE *fp; printf("\n[%s]\n", "...open file for me now..."); if (fp=fopen(fn,mode)) { printf("[%s]\n", "file is open"); return fp; } else { printf("%s = %s\n", "(!) Error = File openning was failed. ", fn); return NULL; } } /*чтение строки любой длинны в языке си С C - без констант и т.п. - */ /*reading line of free demension - of free length (arbitrary) функция fgets() в качестве последнего считанного символа возвращает '\0' - так что наша строка всего будет отдеделена от "мусора", который может оказаться в хвосте (размер "хвоста" не привысит размер единовременно читаемого блока)*/ char *simple_read_all( char * prompting_message , size_t user_block_size) /* make sure that the input is clear when you call this function */ { /**/ char *result; /*variables and initialization*/ size_t block_size ; if (user_block_size) block_size = user_block_size; /*если пользователь указал собственный , то выбираем его как рабочий*/ else block_size = 5; /*иначе используем стандартный блок длинной = 5*/ char *block, *temp; size_t size = block_size; size_t n = 0; /* здесь будет храниться размерность считанной строки*/ /*printf("\n=[%s]", "[" .prompting_message. " ]" . "\n");*/ if ( prompting_message) { printf("%s \n", prompting_message); /* show message wich specify the reason of input reading - for examp "input clearing" */ } /*function itself */ result = block = (char*)malloc(size); /*выделяем блоку и строке результата память длинной , равной длинне блока разового чтения*/ if (!result) return NULL; /*если при выделении памяти произошла ошибка - отражаем это в переменной результата*/ *result = '\0'; /* используем это присвоивание как признак успешности - см. дальнейшие комментарии после цикла*/ /*этот цик*/ for (;;) /*этот цикл - ключевой в работе данной функции*/ { if (fgets(block, block_size, stdin) == NULL) /*читаем блок данных стандартой длинн и размещаем данные в переменной "блок"*/ break; /* если при чтении произошла ошибка - выходим из цикла */ n += strlen(block); if (result[n - 1] == '\n') /* если последний сивол считанной строки - это символ конца строки, то.....*/ break; /*...выходим из цикла */ size += block_size; /* наращиваем размерность строки результата на величину, равную длинне стадартного блока чтения*/ temp = (char*)realloc(result, size); /* переразмещаем данные по адресу возвращаемой строки в новой области большего размера - сохраняем адрес этой области в вспомогаетльную переменную */ if (temp == NULL) break; result = temp; /* сохраняем адрес новой области памяти из вспомогательной переменной в оригинальную переменную результата*/ block = result + n; /* перемещаем указатель записи очередного блока данных на первую свободную ячейку памяти в новой области данных*/ } if (result[0] == '\0') /* если в предыдущем цикле нам не удалось ничего прочитать - освобождаем память,которую "держит" указатель на строку-результат и отражаем неуспешность чтения на возвращаемом значении функции*/ { free(result); /*...освобождаем память,которую "держит" указатель на строку-результат...... */ result = NULL;/*....и отражаем неуспешность чтения на возвращаемом значении функции*/ } if ( prompting_message) printf("[%s] \n", "Data was read!"); /* show message wich notify about the end of reading input" */ return result; } /*считывание файла любой длины в строку - сохранение считывание всех данных из файла в строковую переменную на языке си; функция fgets() в качестве последнего считанного символа возвращает '\0' - так что наша строка всего будет отдеделена от "мусора", который может оказаться в хвосте (размер "хвоста" не привысит размер единовременно читаемого блока)*/ char *full_file_r(FILE *fp ,char * prompting_message , size_t user_block_size) /* make sure that the input is clear when you call this function */ { /**/ char *result; /*variables and initialization*/ size_t block_size ; if (user_block_size) block_size = user_block_size; /*если пользователь указал собственный , то выбираем его как рабочий*/ else block_size = 5; /*иначе используем стандартный блок длинной = 5*/ if (!fp) fp =stdin; /*если поток не указан - будем читать из стандартного*/ char *block, *temp; size_t size = block_size; size_t n = 0; /* здесь будет храниться размерность считанной строки*/ /*printf("\n=[%s]", "[" .prompting_message. " ]" . "\n");*/ if ( prompting_message) { printf("%s \n", prompting_message); /* show message wich specify the reason of input reading - for examp "input clearing" */ } /*function itself */ result = block = (char*)malloc(size); /*выделяем блоку и строке результата память длинной , равной длинне блока разового чтения*/ if (!result) return NULL; /*если при выделении памяти произошла ошибка - отражаем это в переменной результата*/ *result = '\0'; /* используем это присвоивание как признак успешности - см. дальнейшие комментарии после цикла*/ /*этот цик*/ for (;;) /*этот цикл - ключевой в работе данной функции*/ { if (fgets(block, block_size, fp) == NULL) /*читаем блок данных стандартой длинны и размещаем данные в переменной "блок"*/ break; /* если при чтении произошла ошибка - выходим из цикла */ n += strlen(block); if (result[n - 1] == EOF) /* если последний сивол считанной строки - это СИМВОЛ КОНЦА ФАЙЛА, то.....*/ break; /*...выходим из цикла */ size += block_size; /* наращиваем размерность строки результата на величину, равную длинне стадартного блока чтения*/ temp = (char*)realloc(result, size); /* переразмещаем данные по адресу возвращаемой строки в новой области большего размера - сохраняем адрес этой области в вспомогаетльную переменную */ if (temp == NULL) break; result = temp; /* сохраняем адрес новой области памяти из вспомогательной переменной в оригинальную переменную результата*/ block = result + n; /* перемещаем указатель записи очередного блока данных на первую свободную ячейку памяти в новой области данных*/ } if (result[0] == '\0') /* если в предыдущем цикле нам не удалось ничего прочитать - освобождаем память,которую "держит" указатель на строку-результат и отражаем неуспешность чтения на возвращаемом значении функции*/ { free(result); /*...освобождаем память,которую "держит" указатель на строку-результат...... */ result = NULL;/*....и отражаем неуспешность чтения на возвращаемом значении функции*/ } if ( prompting_message ) printf("[%s] \n", "File was read"); /* show message wich notify about the end of reading input" */ if (!result) printf("%s \n", "(!) Error data from wasn't read !"); return result; } /* эта функция очистит стандартный поток ввода stdin (обычно - консоль)*/ int inputcl(void) { #if defined IN_WINDOWS fflush(stdin); // если мы в виндоус - просто очищаем поток #else // если же нет -то , так сказать, работаем дальше printf("\n[%s]\n", "If nothing take place - press enter to continue the program execution."); while (getchar() != '\n'); /*remove \n or other useless data*/ #endif return 0; } /*функция printw ("print without") - выведет в консоль строку , игнорируя указанный символ - в частности можно игнорировать перенос строки(знак новой строки)*/ int printw(char * str, char outstr , char *stxt , char * etxt ) { int n=0; char* errmes = " Error(!) = printw() function does not support such parameter \n " ; if (stxt) printf("%s",stxt); while (*(str+n)!='\0') { if (*(str+n)!=outstr) putchar(*(str+n)); n++; } if (etxt) printf("%s",etxt); return 0; } /*функция fprintwf (" filestriam print without ") - аналогична printw() , но дополнительно можно указать файл, в который следует произвести запись - если требуется стандартный поток вывода - просто передайте null )*/ int fprintw(FILE *fs , char * str, char outstr , char *stxt , char * etxt ) { int n=0; char* errmes = " Error(!) = printw() function does not support such parameter \n " ; if (stxt) fprintf(fs,"%s",stxt); while (*(str+n)!='\0') { if (*(str+n)!=outstr) fputc((*(str+n)),fs); n++; } if (etxt) fprintf(fs,"%s",etxt); return 0; }
ну и конечно же заголовочный файл =
#ifndef MYCOMLIB_H #define MYCOMLIB_H int tdarrs_cmp(char **,char **, FILE *); FILE *openfileforme (char *, char *); char** tfile_to_tdarr(FILE *); int tdarr_show(char **); char *full_file_r(FILE * ,char * , size_t ); int inputcl(void); FILE *openfilefor(FILE *,char *,char *); char *simple_read_all( char * , size_t); int printw(char * , char , char *, char *); int fprintw(FILE * , char * , char , char * , char * ); #endif
- Log in to post comments
- 2149 reads