鱼C论坛

 找回密码
 立即注册
查看: 3965|回复: 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

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

char *substring(char *dst,char *src,int start)
{  
        char *p=dst;  
        char *q=src;  
        int length=strlen(src);
    int dstlen=length-4-4; 
        if(start>=length||start<0 || dstlen<1) 
                return NULL;  
        q+=start;
        while(dstlen--)  
        {   
                *(p++)=*(q++); 
        }  
        *(p++)='\0';  
        return dst;
}

char*  getfilename(  const  char * path,char* dst )
{
     struct  _finddata_t  data;
     char  tmp[256]={"\0"};
     long  hnd = _findfirst( path, &data );     
     if  ( hnd < 0 ) 
     {
         return NULL;
     } 
     int   nRet = (hnd <0 ) ? -1 : 1;
     int max=0;
     while  ( nRet >= 0 )
     {
         if  ( data.attrib!= _A_SUBDIR ){

              int t= atoi(substring(tmp,data.name,4));
              if (t>max) max=t;
         }
         nRet = _findnext( hnd, &data );
     }
     _findclose( hnd );     
     sprintf(dst,"file%04d.txt",max+1);
     return dst;
}

int main()
{
        char filename[256]={"\0"};      
        char *file=getfilename(".\\file*.txt",filename);
        FILE *fp;
        if (file){
            fp = fopen(file, "w");
            printf("%s文件创建成功\n",file);
        }else
        {
            fp=fopen("file0001.txt","w");
            printf("初始文件创建成功\n");
        }
        fclose(fp);
        return 0;
       
}

/*
    PS D:\我> ./wp1
    初始文件创建成功
    PS D:\我> ./wp1
    file0002.txt文件创建成功
    PS D:\我> ./wp1
    file0003.txt文件创建成功
    PS D:\我> ./wp1
    file0004.txt文件创建成功
    PS D:\我> ./wp1
    file0005.txt文件创建成功
    PS D:\我> ./wp1
    file0006.txt文件创建成功
    PS D:\我>
*/

最佳答案

查看完整内容

你看看这个呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

char *substring(char *dst,char *src,int start)
{  
        char *p=dst;  
        char *q=src;  
        int length=strlen(src);
    int dstlen=length-4-4; 
        if(start>=length||start<0 || dstlen<1) 
                return NULL;  
        q+=start;
        while(dstlen--)  
        {   
                *(p++)=*(q++); 
        }  
        *(p++)='\0';  
        return dst;
}

char*  getfilename(  const  char * path,char* dst )
{
     struct  _finddata_t  data;
     char  tmp[256]={"\0"};
     long  hnd = _findfirst( path, &data );     
     if  ( hnd < 0 ) 
     {
         return NULL;
     } 
     int   nRet = (hnd <0 ) ? -1 : 1;
     int max=0;
     while  ( nRet >= 0 )
     {
         if  ( data.attrib!= _A_SUBDIR ){

              int t= atoi(substring(tmp,data.name,4));
              if (t>max) max=t;
         }
         nRet = _findnext( hnd, &data );
     }
     _findclose( hnd );     
     sprintf(dst,"file%04d.txt",max+1);
     return dst;
}

int main()
{
        char filename[256]={"\0"};      
        char *file=getfilename(".\\file*.txt",filename);
        FILE *fp;
        if (file){
            fp = fopen(file, "w");
            printf("%s文件创建成功\n",file);
        }else
        {
            fp=fopen("file0001.txt","w");
            printf("初始文件创建成功\n");
        }
        fclose(fp);
        return 0;
       
}

/*
    PS D:\我> ./wp1
    初始文件创建成功
    PS D:\我> ./wp1
    file0002.txt文件创建成功
    PS D:\我> ./wp1
    file0003.txt文件创建成功
    PS D:\我> ./wp1
    file0004.txt文件创建成功
    PS D:\我> ./wp1
    file0005.txt文件创建成功
    PS D:\我> ./wp1
    file0006.txt文件创建成功
    PS D:\我>
*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

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

这个作法是要保留原文件
并持续新增文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

你这样说  别人也没办法帮你
说明白一些   要是说不明白  举例
你这啥意思啊
file01 存在  则创建file02  file01 不存在  则 创建file01  ????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

对!
就试这个

抱歉  个人表达能力不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


那是不是01在就02,此时02在就03假设3也在就04  一直下去???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 11:50:47 | 显示全部楼层
看不懂你的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-29 12:05:25 | 显示全部楼层
什么叫创新文件?生活中处处有创新?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

是的  就是这样
因为困扰小弟很久了.....所以才向大神们提出讨论
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

filelist=glob.glob("file*.txt")
if "file001.txt" not in filelist:
    f=open("file001.txt","w")
    f.close()
else:
    lst=[int(x[4:-4]) for x in filelist]  
    s="file"+"0"*(len(filelist[0][4:-4])-len(str((max(lst)))))+str(max(lst)+1)+".txt"  
    f=open(s,"w")
    f.close()
filelist=glob.glob("file*.txt")
print(filelist)

'''
    PS D:\我> py file.py
    ['file001.txt', 'file002.txt']
    PS D:\我> py file.py
    ['file001.txt', 'file002.txt', 'file003.txt']
    PS D:\我> py file.py
    ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt']
    PS D:\我> py file.py
    ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt']
    PS D:\我> py file.py
    ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt', 'file006.txt']
    PS D:\我> py file.py
    ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt', 'file006.txt', 'file007.txt']
    PS D:\我> py file.py
    ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt', 'file006.txt', 'file007.txt', 'file008.txt']
    PS D:\我> py file.py
    ['file001.txt', 'file002.txt', 'file003.txt', 'file004.txt', 'file005.txt', 'file006.txt', 'file007.txt', 'file008.txt', 'file009.txt']
    PS D:\我> py file.py
'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


建个 i 变量,值就为 1
然后判断,如果 00{i} 存在,i 就++,变成2
然后再判断 00{i},一直循环下去
直到没有 00{i}, 退出循环,新建文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢,我知道C在操作上比较不容易,但我只能使用C语言
主要是因为 在下使用的单片机没有支援 python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

int main(void) {
    FILE *fp;
    fp = fopen("count", "r+");
    if(!fp) {
        fp = fopen("count", "w+");
        fprintf(fp, "1");
        fseek(fp, 0, SEEK_SET);
    }
    size_t count;
    fscanf(fp, "%lu", &count);
    fseek(fp, 0, SEEK_SET);
    fprintf(fp, "%lu", count + 1);
    fclose(fp);
    char buff[128];
    snprintf(buff, 128, "file_%.4lu.txt", count);
    printf("count: %s\n", buff);
    fp = fopen(buff, "w+");
    fprintf(fp, "%s", buff);
    fclose(fp);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-30 16:17:16 | 显示全部楼层
抱歉,文件这方面不太熟悉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 16:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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