⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 文本文件有关操作
💻
📖 第 1 页 / 共 2 页
字号:
  } 
  rc = CFG_OK; 
r_cfg_end: 
  if(fp != NULL) fclose(fp); 
  return rc; 
} 

/* ------------------------------------------------------------------------- */ 
int  CFG_set_key(void *CFG_file, void *section, void *key, void *buf) 
/* 
   Note: 
    section --- not include [] or {} 
    key     --- may include blank space 
    not use '+' for line to be continued 

   Return: 
     0 --- ok 
    <0 --- error 
*/ 
{ 
  FILE *fp1, *fp2; 
  USGC buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1]; 
  int  line_no, line_no1, n, rc, rc2; 
  char *tmpfname; 

  rc = CFG_get_key(CFG_file, section, key, buf1); 
  if(rc <= CFG_ERR && rc != CFG_ERR_OPEN_FILE) return rc; 
  if(rc == CFG_ERR_OPEN_FILE || rc == CFG_SECTION_NOT_FOUND) 
  { 
#if __OS400__                         /* AS/400 */ 
    if((fp1 = fopen((char *)CFG_file, "a, lrecl=92, ccsid=935")) == NULL) 
#else 
    if((fp1 = fopen((char *)CFG_file, "a")) == NULL) 
#endif 
      return CFG_ERR_CREATE_FILE; 
#if __OS400__                         /* AS/400 */ 
    CFG_ssl = '{'; 
    CFG_ssr = '}';  /* .CFG/.INI file section symbol */ 
#else 
    CFG_ssl = '['; 
    CFG_ssr = ']';  /* .CFG/.INI file section symbol */ 
#endif 
    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 __OS400__                         /* AS/400 */ 
  if((fp2 = fopen(tmpfname, "w, lrecl=92, ccsid=935")) == NULL) 
#else 
  if((fp2 = fopen(tmpfname, "w")) == NULL) 
#endif 
    return CFG_ERR_CREATE_FILE; 
  rc2 = CFG_ERR_OPEN_FILE; 
#if __OS400__                         /* AS/400 */ 
  if((fp1 = fopen((char *)CFG_file, "r")) == NULL) goto w_cfg_end; 
#else 
  if((fp1 = fopen((char *)CFG_file, "rb")) == NULL) goto w_cfg_end; 
#endif 
  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 __OS400__                         /* AS/400 */ 
  if((fp = fopen(CFG_file, "r")) == NULL) return CFG_ERR_OPEN_FILE; 
#else 
  if((fp = fopen(CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE; 
#endif 
  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 __OS400__                         /* AS/400 */ 
  if((fp = fopen(CFG_file, "r")) == NULL) return CFG_ERR_OPEN_FILE; 
#else 
  if((fp = fopen(CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE; 
#endif 
  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; 
} 

/* End of file */ 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -