일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- socket
- ws2_32.lib
- 문자열파싱
- UI
- flutter
- 문자열 다루기
- Mat 변수
- background service
- 딕셔너리
- 메모리반환
- C
- 파일입출력
- Kotlin
- 소켓프로그래밍
- InfluxDB
- dictionary
- foreground service
- Android
- vs code
- 연결리스트
- dart
- InfluxDBClient
- Linked List
- 문자열다루기
- vscode
- 콘솔 키보드 이벤트
- 자료구조
- 코틀린
- FTP
- 진수변환기
- Today
- Total
목록C - 이걸 굳이?/유틸리티 (17)
무슨 일로 C 하셨습니까?
앞서 만든 파일 입출력 함수를 가지고 나만의 config 파일을 만들어보겠다. 일단 설정 값들을 가질 구조체를 만든다 typedef struct _Config { int num; char* ip; }Config; 설정 값들이 뭐가 들어갈지는 마음껏 넣어주면 되겠다. 더보기 좀더 동적으로 활용하고 싶다면 2020.10.13 - [C -이걸 굳이?/유틸리티] - [C] 자료구조::딕셔너리 (Dictionary) 지난번에 만든 딕셔너리를 설정 값으로 넣어주면 설정 데이터를 동적으로 지정할 수 있을 것이다. config 구조체에 파일로 저장된 데이터들을 읽는 함수를 만들어보자 int Config_Read(Config* config, char* path) { FILE* stream = NULL; errno_t n..
프로그램 실행 중에 변수에 저장되는 데이터는 지역 변수던 전역 변수던 동적할당이 되었던 정적할당이 되었던 결국 프로그램이 종료되면 데이터도 사라지게 된다. 내가 저장해 놓은 데이터를 다음에 실행할 때에도 유지하고 싶다면 바로 파일 입출력을 이용하면 되겠다. 솔직히 DB도 파일 입출력을 베이스로 만들어진게 아닐까 생각한다. 간단하게 파일을 쓰는 함수를 만들어 보겠다. #include #include void FileWrite() { char* filename = "test1.txt"; FILE* stream = NULL; fopen_s(&stream, filename, "w+"); char* data = "data"; int len = fprintf(stream,"%s\n",data); printf("wr..
scanf() 함수를 쓰게되면 콘솔에 키보드 입력을 할 수 있다. 그러나 이러한 방식은 입력된 내용을 엔터 쳐서 넘기는 것인데 이러한 입력말고 콘솔창에서 키보드 입력에 즉각적으로 반응하도록 만들고 싶다. 거두절미하고 일단 만들어 보자 #include void f() { int key; while (1) { key = getch(); printf("%d\n", key); } } } 단순하다. key라는 변수가 getch()를 통해 입력을 하나씩 받으면 된다. 이런식으로 하나씩 다 찍어보면 키보드의 각 키들이 어떠한 입력을 나타내는지 알 수 있다. 이렇게 찍어보면 알 수 있는건 각 알파벳 키들이 아스키 코드와 일치한다는 점이고 엔터가 개행문자로 입력된다는 것 또한 알 수 있다. 그런데 특정 키는 224로 같..
내가 만든 함수들을 사용하다 문득 하나가 빠졌다는 생각이 들었다. 문자열 복사... 어쩌면 가장 먼저 나왔어야할 함수인데... 지난번에 만든 문자열 합성 함수를 쓰면 되긴 하는데 매번 빈문자열도 같이 집어넣기 귀찮으므로 하나 만들겠다. 데이터 복사하는 것이야 어려운 일이 아니다. int num = 3; int ber= num; num = 4; printf("%d",num); // 4 printf("%d",ber); // 3 대입 연산자('=')는 오른쪽의 값을 왼쪽에 복사하는 것이기 때문에 대입 연산자를 쓰기만 해도 데이터는 복사가 된다. 그러나 데이터가 배열인 경우는 이야기가 다르다 int num[3] = {1,2,3}; int ber[3]; int* ptr; num = ber; // 컴파일 에러 pt..

C를 가지고 여러 가지 프로그램을 만들다 보면 모종의 이유로 메모리 관리에 신경 쓰게 된다. 이러한 메모리를 반환시키는 함수를 만들도록 하겠다. 사실 동적할당된 메모리만 free()를 사용해서 반환하면 그만이다 그런데 해당 변수가 어디서 선언됐는지 모르면 이야기가 달라진다 ( 포인터가 가르키는 메모리가 동적 변수인지 지역변수인지 알 방법이 없다) 지역변수를 free()하면 에러가 발생하기 때문에 정체모를 메모리를 반환시켜주는데 큰 애로 사항이 꽃피기 시작한다. 고로 자동으로 구분해서 메모리를 반환하는 함수를 만들어주면 되겠다 함수 기능 메모리를 알아서 잘 반환 시켜줌 입력값 어디서 선언됐는지 모를 메모리 주소 대충 설계를 해보자면 메모리가 어디에 할당됐는지 알기만 하면 되는데 그것을 알방법이 주소뿐이니 ..
추가로 필요한 함수를 더 만들어보자 int DICTIONARY_Delete(dictionary* head, char* key) { _dictionary* ptr = head->head; _dictionary* pre = NULL; while (true) { if (ptr == NULL) return false; else if (StringCompare(ptr->key, key) == COMPARE_SAME) break; pre = ptr; ptr = ptr->link; } if (pre == NULL) { free(ptr); head->head = NULL; } else { pre->link = ptr->link; free(ptr); } head->count--; return true; } 삭제 함수는 ..
파이썬을 사용하다보면 은근히 많이 사용되는게 바로 딕셔너리다 key - value 로 값을 접근하고 저장할 수 있다는 점이 상당히 매력적이다 그런 매력적인 자료형을 C에서 사용하지 아니할 수 없다 고로 구현해보자 typedef struct _DICTIONARY { char* key; void* value; struct _DICTIONARY* link; }_dictionary; typedef struct DICTIONARY { int count; struct _DICTIONARY* head; }dictionary; 우선 구조체 부터 만들면 다음과 같다 전체적인 부분은 연결 리스트와 동일하나 value 값으로 문자열 뿐만아니라 숫자 다른 구조체 등 여러 자료형을 동시에 받을 수 있도록 void형 포인터를 사..
리스트를 정의하고 맨 뒤에 데이터를 추가하는 함수까지 만들었다 추가로 리스트에 필요한 여러함수를 구현하자 우선은 데이터가 잘 들어갔는지 확인도 할겸 출력함수 부터 구현하자 void LIST_Show(list head) { node* temp = head.body; int i = 0; printf("--- total count : %d\n", head.count); while (temp!=NULL) { printf("%d - %s\n", i,temp->data); i++; temp = temp->link; } } 코드 로직적으로 복잡할게 없고 에러가 발생할 일도 없으니 간단하게 구현했다. 그 다음은 전체 메모리 반환이다. 메모리를 썼으면 적절하게 반환하는걸 잊지말자 int LIST_Release(list*..