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

📄 gcftxtf.c

📁 完整的Dos下读写Txt文件程序。 包括CSV格式和Ini格式。
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -