鱼C论坛

 找回密码
 立即注册
查看: 4551|回复: 15

[已解决]C语言文件比对后创新文件

[复制链接]
发表于 2021-6-29 09:56:25 | 显示全部楼层 |阅读模式
50鱼币
希望大神们指导

档案建立后 无法新增档案
会以同一个文件持续下去 且覆盖原文件内容

我想要做到文件比对
若文件存在
则创新文件
若不存在
也创新文件
但每次只创建一个新文件

内部内容可以直接写入任意值

档名以流水号形式增加

example :

file_001
file_002
file_003.
.
.
.
file_020
最佳答案
2021-6-29 09:56:26
a87949 发表于 2021-6-30 09:44
谢谢,我知道C在操作上比较不容易,但我只能使用C语言
主要是因为 在下使用的单片机没有支援 python

你看看这个呢??
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <io.h>
  4. #include <string.h>

  5. char *substring(char *dst,char *src,int start)
  6. {  
  7.         char *p=dst;  
  8.         char *q=src;  
  9.         int length=strlen(src);
  10.     int dstlen=length-4-4;
  11.         if(start>=length||start<0 || dstlen<1)
  12.                 return NULL;  
  13.         q+=start;
  14.         while(dstlen--)  
  15.         {   
  16.                 *(p++)=*(q++);
  17.         }  
  18.         *(p++)='\0';  
  19.         return dst;
  20. }

  21. char*  getfilename(  const  char * path,char* dst )
  22. {
  23.      struct  _finddata_t  data;
  24.      char  tmp[256]={"\0"};
  25.      long  hnd = _findfirst( path, &data );     
  26.      if  ( hnd < 0 )
  27.      {
  28.          return NULL;
  29.      }
  30.      int   nRet = (hnd <0 ) ? -1 : 1;
  31.      int max=0;
  32.      while  ( nRet >= 0 )
  33.      {
  34.          if  ( data.attrib!= _A_SUBDIR ){

  35.               int t= atoi(substring(tmp,data.name,4));
  36.               if (t>max) max=t;
  37.          }
  38.          nRet = _findnext( hnd, &data );
  39.      }
  40.      _findclose( hnd );     
  41.      sprintf(dst,"file%04d.txt",max+1);
  42.      return dst;
  43. }

  44. int main()
  45. {
  46.         char filename[256]={"\0"};      
  47.         char *file=getfilename(".\\file*.txt",filename);
  48.         FILE *fp;
  49.         if (file){
  50.             fp = fopen(file, "w");
  51.             printf("%s文件创建成功\n",file);
  52.         }else
  53.         {
  54.             fp=fopen("file0001.txt","w");
  55.             printf("初始文件创建成功\n");
  56.         }
  57.         fclose(fp);
  58.         return 0;
  59.       
  60. }

  61. /*
  62.     PS D:\我> ./wp1
  63.     初始文件创建成功
  64.     PS D:\我> ./wp1
  65.     file0002.txt文件创建成功
  66.     PS D:\我> ./wp1
  67.     file0003.txt文件创建成功
  68.     PS D:\我> ./wp1
  69.     file0004.txt文件创建成功
  70.     PS D:\我> ./wp1
  71.     file0005.txt文件创建成功
  72.     PS D:\我> ./wp1
  73.     file0006.txt文件创建成功
  74.     PS D:\我>
  75. */
复制代码

最佳答案

查看完整内容

你看看这个呢??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 09:56:26 | 显示全部楼层    本楼为最佳答案   
a87949 发表于 2021-6-30 09:44
谢谢,我知道C在操作上比较不容易,但我只能使用C语言
主要是因为 在下使用的单片机没有支援 python

你看看这个呢??
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <io.h>
  4. #include <string.h>

  5. char *substring(char *dst,char *src,int start)
  6. {  
  7.         char *p=dst;  
  8.         char *q=src;  
  9.         int length=strlen(src);
  10.     int dstlen=length-4-4;
  11.         if(start>=length||start<0 || dstlen<1)
  12.                 return NULL;  
  13.         q+=start;
  14.         while(dstlen--)  
  15.         {   
  16.                 *(p++)=*(q++);
  17.         }  
  18.         *(p++)='\0';  
  19.         return dst;
  20. }

  21. char*  getfilename(  const  char * path,char* dst )
  22. {
  23.      struct  _finddata_t  data;
  24.      char  tmp[256]={"\0"};
  25.      long  hnd = _findfirst( path, &data );     
  26.      if  ( hnd < 0 )
  27.      {
  28.          return NULL;
  29.      }
  30.      int   nRet = (hnd <0 ) ? -1 : 1;
  31.      int max=0;
  32.      while  ( nRet >= 0 )
  33.      {
  34.          if  ( data.attrib!= _A_SUBDIR ){

  35.               int t= atoi(substring(tmp,data.name,4));
  36.               if (t>max) max=t;
  37.          }
  38.          nRet = _findnext( hnd, &data );
  39.      }
  40.      _findclose( hnd );     
  41.      sprintf(dst,"file%04d.txt",max+1);
  42.      return dst;
  43. }

  44. int main()
  45. {
  46.         char filename[256]={"\0"};      
  47.         char *file=getfilename(".\\file*.txt",filename);
  48.         FILE *fp;
  49.         if (file){
  50.             fp = fopen(file, "w");
  51.             printf("%s文件创建成功\n",file);
  52.         }else
  53.         {
  54.             fp=fopen("file0001.txt","w");
  55.             printf("初始文件创建成功\n");
  56.         }
  57.         fclose(fp);
  58.         return 0;
  59.       
  60. }

  61. /*
  62.     PS D:\我> ./wp1
  63.     初始文件创建成功
  64.     PS D:\我> ./wp1
  65.     file0002.txt文件创建成功
  66.     PS D:\我> ./wp1
  67.     file0003.txt文件创建成功
  68.     PS D:\我> ./wp1
  69.     file0004.txt文件创建成功
  70.     PS D:\我> ./wp1
  71.     file0005.txt文件创建成功
  72.     PS D:\我> ./wp1
  73.     file0006.txt文件创建成功
  74.     PS D:\我>
  75. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 10:14:31 From FishC Mobile | 显示全部楼层
若文件存在
则创新文件
若不存在
也创新文件
这不就是直接创建新文件,还要判断文件是否存在???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-29 11:17:51 | 显示全部楼层
在不确定的情况下是否能能够确定文件是否存在
采用连续新增的做法
为了避免 覆盖掉之前的文件 所以要先确认是否有已存在之文件

要的
因为创新文件
并不会持续创新
而是会覆盖掉原本的文件

这个作法是要保留原文件
并持续新增文件
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 11:42:19 | 显示全部楼层
a87949 发表于 2021-6-29 11:17
在不确定的情况下是否能能够确定文件是否存在
采用连续新增的做法
为了避免 覆盖掉之前的文件 所以要先确 ...

你这样说  别人也没办法帮你
说明白一些   要是说不明白  举例
你这啥意思啊
file01 存在  则创建file02  file01 不存在  则 创建file01  ????
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-29 11:44:49 | 显示全部楼层
wp231957 发表于 2021-6-29 11:42
你这样说  别人也没办法帮你
说明白一些   要是说不明白  举例
你这啥意思啊

对!
就试这个

抱歉  个人表达能力不好
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 11:47:18 From FishC Mobile | 显示全部楼层
a87949 发表于 2021-6-29 11:44
对!
就试这个


那是不是01在就02,此时02在就03假设3也在就04  一直下去???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 11:50:47 | 显示全部楼层
看不懂你的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 12:05:25 | 显示全部楼层
什么叫创新文件?生活中处处有创新?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-29 13:05:59 | 显示全部楼层
wp231957 发表于 2021-6-29 11:47
那是不是01在就02,此时02在就03假设3也在就04  一直下去???

是的  就是这样
因为困扰小弟很久了.....所以才向大神们提出讨论
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 13:42:14 | 显示全部楼层
a87949 发表于 2021-6-29 13:05
是的  就是这样
因为困扰小弟很久了.....所以才向大神们提出讨论

我好久都不写c代码了,估计都忘了,而且c操作字符串也不如其他语言方便
我用python写了一段   你看看 是不是你要的意思

  1. import glob

  2. filelist=glob.glob("file*.txt")
  3. if "file001.txt" not in filelist:
  4.     f=open("file001.txt","w")
  5.     f.close()
  6. else:
  7.     lst=[int(x[4:-4]) for x in filelist]  
  8.     s="file"+"0"*(len(filelist[0][4:-4])-len(str((max(lst)))))+str(max(lst)+1)+".txt"  
  9.     f=open(s,"w")
  10.     f.close()
  11. filelist=glob.glob("file*.txt")
  12. print(filelist)

  13. '''
  14.     PS D:\我> py file.py
  15.     ['file001.txt', 'file002.txt']
  16.     PS D:\我> py file.py
  17.     ['file001.txt', 'file002.txt', 'file003.txt']
  18.     PS D:\我> py file.py
  19.     ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt']
  20.     PS D:\我> py file.py
  21.     ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt']
  22.     PS D:\我> py file.py
  23.     ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt', 'file006.txt']
  24.     PS D:\我> py file.py
  25.     ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt', 'file006.txt', 'file007.txt']
  26.     PS D:\我> py file.py
  27.     ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt', 'file006.txt', 'file007.txt', 'file008.txt']
  28.     PS D:\我> py file.py
  29.     ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt', 'file006.txt', 'file007.txt', 'file008.txt', 'file009.txt']
  30.     PS D:\我> py file.py
  31. '''
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 19:04:11 | 显示全部楼层
a87949 发表于 2021-6-29 13:05
是的  就是这样
因为困扰小弟很久了.....所以才向大神们提出讨论


建个 i 变量,值就为 1
然后判断,如果 00{i} 存在,i 就++,变成2
然后再判断 00{i},一直循环下去
直到没有 00{i}, 退出循环,新建文件
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-30 09:44:23 | 显示全部楼层
wp231957 发表于 2021-6-29 13:42
我好久都不写c代码了,估计都忘了,而且c操作字符串也不如其他语言方便
我用python写了一段   你看看 是 ...

谢谢,我知道C在操作上比较不容易,但我只能使用C语言
主要是因为 在下使用的单片机没有支援 python
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-30 11:02:53 | 显示全部楼层
a87949 发表于 2021-6-30 09:44
谢谢,我知道C在操作上比较不容易,但我只能使用C语言
主要是因为 在下使用的单片机没有支援 python
  1. #include <stdio.h>

  2. int main(void) {
  3.     FILE *fp;
  4.     fp = fopen("count", "r+");
  5.     if(!fp) {
  6.         fp = fopen("count", "w+");
  7.         fprintf(fp, "1");
  8.         fseek(fp, 0, SEEK_SET);
  9.     }
  10.     size_t count;
  11.     fscanf(fp, "%lu", &count);
  12.     fseek(fp, 0, SEEK_SET);
  13.     fprintf(fp, "%lu", count + 1);
  14.     fclose(fp);
  15.     char buff[128];
  16.     snprintf(buff, 128, "file_%.4lu.txt", count);
  17.     printf("count: %s\n", buff);
  18.     fp = fopen(buff, "w+");
  19.     fprintf(fp, "%s", buff);
  20.     fclose(fp);
  21.     return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-30 16:17:16 | 显示全部楼层
抱歉,文件这方面不太熟悉
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-1 10:22:58 | 显示全部楼层
感谢大神的指导
本次最佳答案 经由实验来说明
人大大: 在使用上,会造成系统增加大量的DLL档案,在移植后一样也会在新系统增加档案 若删除 前次的档案 顺序不会 reset
w大大 : 会先确定是文件是否存在然后才会新增档案 ,若旧有文件移除后,会从头开始新增
所以选择W大大为最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表