📄 gcftxtf.c
字号:
if(rc == CFG_ERR_OPEN_FILE || rc == CFG_SECTION_NOT_FOUND) { if((fp1 = fopen((char *)CFG_file, "a")) == NULL) return CFG_ERR_CREATE_FILE; CFG_ssl = '['; CFG_ssr = ']'; /* .CFG/.INI file section symbol */ if(fprintf(fp1, "%c%s%c\n", CFG_ssl, section, CFG_ssr) == EOF) { fclose(fp1); return CFG_ERR_WRITE_FILE; } if(fprintf(fp1, "%s=%s\n", key, buf) == EOF) { fclose(fp1); return CFG_ERR_WRITE_FILE; } fclose(fp1); return CFG_OK; } if((tmpfname = tmpnam(NULL)) == NULL) return CFG_ERR_CREATE_FILE; if((fp2 = fopen(tmpfname, "w")) == NULL) return CFG_ERR_CREATE_FILE; rc2 = CFG_ERR_OPEN_FILE; if((fp1 = fopen((char *)CFG_file, "rb")) == NULL) goto w_cfg_end; if(rc == CFG_KEY_NOT_FOUND) line_no1 = CFG_section_line_no; else /* rc = CFG_OK */ line_no1 = CFG_key_line_no - 1; for(line_no = 0; line_no < line_no1; line_no++) { rc2 = CFG_ERR_READ_FILE; n = fgetline(fp1, buf1, MAX_CFG_BUF); if(n < 0) goto w_cfg_end; rc2 = CFG_ERR_WRITE_FILE; if(fprintf(fp2, "%s\n", buf1) == EOF) goto w_cfg_end; } if(rc != CFG_KEY_NOT_FOUND) for( ; line_no < line_no1+CFG_key_lines; line_no++) { rc2 = CFG_ERR_READ_FILE; n = fgetline(fp1, buf1, MAX_CFG_BUF); if(n < 0) goto w_cfg_end; } rc2 = CFG_ERR_WRITE_FILE; if(fprintf(fp2, "%s=%s\n", key, buf) == EOF) goto w_cfg_end; while(1) { rc2 = CFG_ERR_READ_FILE; n = fgetline(fp1, buf1, MAX_CFG_BUF); if(n < -1) goto w_cfg_end; if(n < 0) break; rc2 = CFG_ERR_WRITE_FILE; if(fprintf(fp2, "%s\n", buf1) == EOF) goto w_cfg_end; } rc2 = CFG_OK;w_cfg_end: if(fp1 != NULL) fclose(fp1); if(fp2 != NULL) fclose(fp2); if(rc2 == CFG_OK) { rc = copy_txt_file(tmpfname, CFG_file); if(rc != 0) return CFG_ERR_CREATE_FILE; } remove(tmpfname); return rc2;}/* ------------------------------------------------------------------------- */int CFG_get_sections(void *CFG_file, USGC *sections[])/* 取.CFG/.INI等配置文件的所有section名字(用[]或{}括起的,不返回括弧),返回section个数。若出错,返回负数。*/{ FILE *fp; USGC buf1[MAX_CFG_BUF + 1]; int n, n_sections = 0, rc; if((fp = fopen(CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE; while(1) /* seek section */ { rc = CFG_ERR_READ_FILE; n = fgetline(fp, buf1, MAX_CFG_BUF); if(n < -1) goto cfg_scts_end; if(n < 0) break; /* EOF */ n = mstrlen(ltrimstr(rtrimstr(buf1))); if(n == 0 || buf1[0] == ';') continue; /* blank/remarks line */ rc = CFG_ERR_FILE_FORMAT; if(n > 2 && ((buf1[0] == '[' && buf1[n-1] != ']') || (buf1[0] == '{' && buf1[n-1] != '}'))) goto cfg_scts_end; if(buf1[0] == '[' || buf1[0] == '{') { buf1[n-1] = 0x00; mstrcpy(sections[n_sections], buf1+1); n_sections++; } } rc = n_sections;cfg_scts_end: if(fp != NULL) fclose(fp); return rc;}/* ------------------------------------------------------------------------- */int CFG_get_keys(void *CFG_file, void *section, USGC *keys[])/* 取.CFG/.INI等配置文件的某个section下的所有key的名字(key=value形式, value可用加号表示续行),返回key个数。若出错,返回负数。*/{ FILE *fp; USGC buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1]; USGC *key_ptr, *val_ptr; int n, n_keys = 0, rc; if((fp = fopen(CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE; while(1) /* seek section */ { rc = CFG_ERR_READ_FILE; n = fgetline(fp, buf1, MAX_CFG_BUF); if(n < -1) goto cfg_keys_end; rc = CFG_SECTION_NOT_FOUND; if(n < 0) goto cfg_keys_end; /* EOF, not found */ n = mstrlen(ltrimstr(rtrimstr(buf1))); if(n == 0 || buf1[0] == ';') continue; /* blank/remarks line */ rc = CFG_ERR_FILE_FORMAT; if(n > 2 && ((buf1[0] == '[' && buf1[n-1] != ']') || (buf1[0] == '{' && buf1[n-1] != '}'))) goto cfg_keys_end; if(buf1[0] == '[' || buf1[0] == '{') { buf1[n-1] = 0x00; if(mstrcmp(buf1+1, section) == 0) break; /* section found */ } } while(1) { rc = CFG_ERR_READ_FILE; n = fgetline(fp, buf1, MAX_CFG_BUF); if(n < -1) goto cfg_keys_end; if(n < 0) break; /* EOF */ n = mstrlen(ltrimstr(rtrimstr(buf1))); if(n == 0 || buf1[0] == ';') continue; /* blank/remarks line */ rc = CFG_KEY_NOT_FOUND; if(buf1[0] == '[' || buf1[0] == '{') break; /* another section */ if(buf1[n-1] == '+') /* to be continued */ { buf1[n-1] = 0x00; while(1) { rc = CFG_ERR_READ_FILE; n = fgetline(fp, buf2, MAX_CFG_BUF); if(n < -1) goto cfg_keys_end; if(n < 0) break; /* EOF */ n = mstrlen(rtrimstr(buf2)); rc = CFG_ERR_EXCEED_BUF_SIZE; if(n > 0 && buf2[n-1] == '+') /* to be continued */ { buf2[n-1] = 0x00; if(mstrlen(buf1) + mstrlen(buf2) > MAX_CFG_BUF) goto cfg_keys_end; mstrcat(buf1, buf2); continue; } if(mstrlen(buf1) + mstrlen(buf2) > MAX_CFG_BUF) goto cfg_keys_end; mstrcat(buf1, buf2); break; } } rc = CFG_ERR_FILE_FORMAT; if(split_key_val(buf1, &key_ptr, &val_ptr) != 1) goto cfg_keys_end; ltrimstr(rtrimstr(key_ptr)); mstrcpy(keys[n_keys], key_ptr); n_keys++; } rc = n_keys;cfg_keys_end: if(fp != NULL) fclose(fp); return rc;}/* ------------------------------------------------------------------------- */int read_txt_line(void *TXT_file, int line_no, void *buf)/* 读文本文件中指定行号(以1始计)的内容到buf 返回行内容长度,出错返回负数。*/{ FILE *fp; int lno, n1; USGC buf1[256]; if((fp = fopen((char *)TXT_file, "r")) == NULL) return TXTF_ERR_OPEN_FILE; for(lno = 0; lno < line_no; lno++) { memset(buf1, 0x00, 256); if(fgets((char *)buf1, 255, fp) == NULL) { n1 = mstrlen(buf1); if(n1 == 0) { if(ferror(fp) != 0) { fclose(fp); return TXTF_ERR_READ_FILE; } break; } break; } } if(lno < line_no) { fclose(fp); return TXTF_ERR_NOT_FOUND; } n1 = mstrlen(buf1); if(n1 > 0 && buf1[n1-1] == '\n') buf1[--n1] = 0x00; mstrcpy(buf, buf1); fclose(fp); return n1;}/* ------------------------------------------------------------------------- */int seek_txt_line(void *TXT_file, void *line_tag, void *buf)/* 查找文本文件中以line_tag内容开始的行,读其内容到 buf,返回行号(以1始计),出错返回负数。*/{ FILE *fp; int line_no, n, n1; USGC buf1[256]; n = mstrlen(line_tag); if((fp = fopen((char *)TXT_file, "r")) == NULL) return TXTF_ERR_OPEN_FILE; for(line_no = 1; ; line_no++) { memset(buf1, 0x00, 256); if(fgets((char *)buf1, 255, fp) == NULL) { n1 = mstrlen(buf1); if(n1 == 0) { if(ferror(fp) != 0) { fclose(fp); return TXTF_ERR_READ_FILE; } fclose(fp); /* eof */ return TXTF_ERR_NOT_FOUND; } if(mstrncmp(buf1, line_tag, n) == 0) break; fclose(fp); /* eof */ return TXTF_ERR_NOT_FOUND; } if(mstrncmp(buf1, line_tag, n) == 0) break; } n1 = mstrlen(buf1); if(n1 > 0 && buf1[n1-1] == '\n') buf1[--n1] = 0x00; mstrcpy(buf, buf1); fclose(fp); return line_no;}/*-------------------------------------------------------------------------*/int fReadNumber_InALine(FILE *fp, float *DSnumber, short MumberMax){ short NoteCount, NumberCount, CharCount; char TempChar[1024], LineEndFlag; if (feof(fp)) return 0; LineEndFlag=0; for (NumberCount=0; NumberCount<MumberMax; ) { if (feof(fp)) break; NoteCount=0; for (CharCount=0; ; ) { TempChar[CharCount]=fgetc(fp); if (CharCount>=1024) { printf("Too much chars in a line!\n"); return 0; } if (TempChar[CharCount]=='/') { for(;;) { TempChar[CharCount]=fgetc(fp); if (TempChar[CharCount]=='\n') break; if (feof(fp)) break; } } if (feof(fp)) break; if (TempChar[CharCount]=='\n') { LineEndFlag=1; break; } if ((TempChar[CharCount]>='0')&&(TempChar[CharCount]<='9')) { CharCount++; continue; } if ((TempChar[CharCount]=='-')&&(CharCount==0)) { CharCount++; continue; } if (TempChar[CharCount]=='.') { CharCount++; continue; } if (CharCount==0) continue; else break; } if (CharCount!=0) { TempChar[CharCount]='\0'; DSnumber[NumberCount]=((float)(atof(TempChar))); NumberCount++; }else break; if (LineEndFlag==1) break; } return NumberCount;}/* End of file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -