C 如何使用文本文件(制表符分隔格式)的内容重命名文件夹中的文件?

C 如何使用文本文件(制表符分隔格式)的内容重命名文件夹中的文件?,c,windows,string,rename,C,Windows,String,Rename,我正在尝试制作电子证书,为我的大学活动分发。我使用Photoshop生成了具有不同名称和卷号的批处理证书。现在文件名为core_01数据集1.jpg,core_02数据集2.jpg,等等。为了在线分发,需要重命名并排序参与者的姓名。 我有一个.txt文件,里面有参和者的名字,他们的卷号和学校名称(以制表符分隔的格式)。我需要根据.txt文件的内容重命名这些文件。我已经尽力了,但没能走远。请帮忙 #include<stdio.h> #include<dirent.h> in

我正在尝试制作电子证书,为我的大学活动分发。我使用Photoshop生成了具有不同名称和卷号的批处理证书。现在文件名为core_01数据集1.jpgcore_02数据集2.jpg,等等。为了在线分发,需要重命名并排序参与者的姓名。 我有一个.txt文件,里面有参和者的名字,他们的卷号和学校名称(以制表符分隔的格式)。我需要根据.txt文件的内容重命名这些文件。我已经尽力了,但没能走远。请帮忙

#include<stdio.h>
#include<dirent.h>
int main()
{
    FILE *fp;
    char arr[3][20][40];
    int i=0;

    char final_name[19][50]={0};

    fp = fopen("./new/core.txt", "r");
    while(fgetc(fp)!=EOF)
    {
     while(fgetc(fp)!='\n' && i<20)
     {
        fscanf(fp,"%s%s%s", arr[0][i], arr[1][i], arr[2][i]);
        i++;
     }
    }

    i=1;
    while(i<20)
    {
        strcat(final_name[i-1], arr[0][i]);
        strcat(final_name[i-1], "_");
        strcat(final_name[i-1], arr[1][i]);
        strcat(final_name[i-1], "_");
        strcat(final_name[i-1], arr[2][i]);
        printf("%s\n", final_name[i-1]);
        i++;
    }
    char name[19][50]={0};
    char buf[19][50]={0};

    for(i=1; i<20; i++)
    {
        if(i<10)
        {
            sprintf(buf[i-1], "core_0%d_Data Set %d", i, i);
        }
        else
        {
            sprintf(buf[i-1], "core_%d_Data Set %d", i, i);
        }

        printf("%s...\n", buf[i-1]);
        name[i-1]=buf[i-1];
    }

    i=0;
    DIR *d;
    struct dirent *dir;
    d = opendir("./new/");
    if (d)
    {
        while ((dir = readdir(d)) != NULL )
        {
            printf("%s\n", dir->d_name);
            if (strcmp(dir->d_name, buf[i]) == 0)
            {
                rename(dir->d_name, final_name[i]);
                i++;
            }
        }
        closedir(d);
    }
}
#包括
#包括
int main()
{
文件*fp;
字符arr[3][20][40];
int i=0;
char final_name[19][50]={0};
fp=fopen(“./new/core.txt”,“r”);
while(fgetc(fp)!=EOF)
{

while(fgetc(fp)!='\n'&&i仅为您提供一种理解错误的方法,请参见下面的代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <string.h>

int main(int argc, char **argv)
{
    FILE *fp;
    char arr[3][20][40];
    int i=0;
    int numberOfNames = 0;

    fp = fopen("a.txt", "r");

    // read until fscanf can get 3 items from file considering tabs as space between strings
    while((fscanf(fp,"%s\t%s\t%s", arr[0][numberOfNames], arr[1][numberOfNames], arr[2][numberOfNames]) == 3) && (numberOfNames<20))
    {
        printf("%s %s %s\n", arr[0][numberOfNames], arr[1][numberOfNames], arr[2][numberOfNames]);
        numberOfNames++;
    }

    // this init only the first string with null termination
    char final_name[20][50]={0};
    //This init the whole matrix
    memset(final_name, 0, 1000);

    i=0;
    while(i<numberOfNames)
    {
        strcat(final_name[i], arr[0][i]);
        strcat(final_name[i], "_");
        strcat(final_name[i], arr[1][i]);
        strcat(final_name[i], "_");
        strcat(final_name[i], arr[2][i]);
        printf("%s\n", final_name[i]);
        i++;
    }

    char name[19][50]={0};
    char buf[19][50]={0};

    for(i=1; i<=numberOfNames; i++)
    {
        // Using %02d format you grants that the output is always with 2 digit at least and padded with 0
        sprintf(buf[i-1], "core_%02d_Data Set %d", i, i);

        printf("%s...\n", buf[i-1]);
        // sprintf is the way to copy a string into another string
        // You cannot simply name[i-1]=buf[i-1];
        sprintf(name[i-1],buf[i-1]);
        printf("%s\n", buf[i-1]);
    }
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
文件*fp;
字符arr[3][20][40];
int i=0;
int numberOfNames=0;
fp=fopen(“a.txt”、“r”);
//读取,直到fscanf可以从文件中获取3项,并将选项卡视为字符串之间的空间

而((fscanf(fp,“%s\t%s\t%s”,arr[0][numberOfNames],arr[1][numberOfNames],arr[2][numberOfNames])==3)和&(numberOfNames如果需要,可以使用python

#!/usr/bin/python
import string,os

f=open("in.txt")
a=f.readlines();

for x in a:
        x=x[:-1]
        r=string.split(x,",")
        os.rename(r[0],r[1])

如果你想的话,你可以使用powershell。我想这会有用的

$names = (gc core.txt)
$idx = 1

gci core*.jpg | %{
    $newname = $names[$idx++].trim().split("`t")[0] + ".jpg"
    ren $_ $newname
}

编辑:就是这样

.trim().split("`t")[0]
在选项卡上拆分core.txt的每一行并返回第一个元素的部分。如果希望同时包含其他列,请尝试以下操作:

$names = (gc core.txt)
$idx = 1

gci core*.jpg | %{
    $newname = ($names[$idx++].trim() -replace "`t+","-") + ".jpg"
    ren $_ $newname
}

为什么还要用C语言呢?只要使用任何简单的脚本语言就行了。如果不是Windows,我建议使用shell,但仍然可以用python或perl(适用于Windows)这样的语言轻松实现我相信PosithBek也会工作,虽然我对C和C++比较熟悉,但我决定继续和他们合作。有什么帮助吗?问题的答案是C,而不是Python。这是一个使用Python的建议,用户没有说C是必需的。而且..批准的答案是在Powershell中。谢谢,我第一次尝试Powershell,它成功了。你能告诉我如何将卷号和学院名添加到重命名的文件中吗?我是Powershell的第一个新手。这里最新截图:@peakyushbhardwaj查看编辑。我们现在不再在选项卡上拆分,而是将一个或多个连续选项卡的每个实例替换为破折号。如果您正在自学PowerShell,我使用的一些命令是速记别名。
gc
表示
获取内容
gci
表示
获取内容ILDitem项 >代码> %s/COD>指代码>前缀项 >代码> Re>代码>重命名项。PowerShell的语法与C和C++有很大的不同,因为它经常将一个命令的结果管到另一个命令的输入中:<代码>获取子项核心*.jpg前项{ do-task}//>。