我是C编程语言的新手。我正在编写一个程序,最终将从用户输入的目录中读取mp3文件,并利用id3中的元数据将mp3分类为艺术家/专辑文件夹。我使用system()函数调用访问用户的目录,并生成包含该目录中所有mp3的.txt文件。但是,当我尝试访问第一个mp3文件时,我遇到了问题。我正在构建mp3文件的路径,但该文件无法打开。当我对路径进行硬编码时,文件会打开。
#include <stdio.h>
#include <string.h>
struct FILE_head
{
char file_id[3];
char version[2];
char flags;
char size[4];
};
int main()
{
//declare vars
char cd[1200];
char mp3[200];
char dir[1000];
char mp3_path[1200];
FILE *list_file;
FILE *mp3_file;
struct FILE_head id3;
char dir_cmd[1300] = "dir ";
char find_cmd[100] = "/b | find \".mp3\" > \"mp3List.txt\"";
int dir_len;
int amt_read;
//main code
while(1)
{
cd[0]='c';
cd[1]='d';
cd[2]=' ';
cd[3]='\0';
printf("Enter the directory where mp3's are located:");
scanf("%s", dir);
strcat(cd, dir);
if(system(cd) == 0) //if directory is valid, break. otherwise stay in loop/reprompt
break;
printf("Valid directory Ex--> c:\\users\\username\\music\n");
}
//build cmd statement
strcat(dir_cmd, dir);
strcat(dir_cmd, find_cmd);
system(dir_cmd);
dir_len = strlen(dir);
strcpy(mp3_path, dir);
printf("%s\n", mp3_path);
list_file = fopen("mp3List.txt", "rb");
if(list_file != NULL)
{
while(fgets(mp3, sizeof(mp3), list_file))
{
printf("%s", mp3);
strcat(mp3_path, mp3);
printf("%s\n", mp3_path);
mp3_path[strlen(mp3_path)-1] = '\0';
mp3_file = fopen(mp3_path, "rb");
if(mp3_file != NULL)
{
printf("in this loop");
fread(&id3, sizeof(id3), 1, mp3_file);
printf("%s\n", id3.file_id);
}
}
}
return 0;
}
这是我第一次发帖,所以如果有更多信息有用,请告诉我。我意识到可能会有更好的&#34;访问目录的方法,但我不想使用任何不在 C 标准库中的函数。
这是我的输出:
C:\ Users \ Mitchell \ Projects&gt; mp3sort.exe进入mp3&#39; s的目录 位于:c:\ users \ mitchell \ projects \ music_test \ c:\ users \ mitchell \ projects \ music_test \ 01 - Time to Pretend.mp3 c:\ users \ mitchell \ projects \ music_test \ 01 - Time to Pretend.mp3
01-all_that_remains-this_calling.mp3 01-all_that_remains-this_calling.mp3t \ 01 - Time to Pretend.mp3
07比利乔尔 - 每个人都爱你.mp3 07比利乔尔 - 每个人 爱你Now.mp3Time to Pretend.mp3
为Sheep.mp3dy爱你的Sheep.mp3眼泪的泪水 Now.mp3Time到Pretend.mp3
C:\用户\米切尔\项目与GT;
我知道我在第一个文件之后的所有文件的当前版本都不正确,但我只是专注于让第一个mp3_path工作。我删除了换行符:mp3_path[strlen(mp3_path)-1] = '\0';
答案 0 :(得分:2)
system()
在子进程中执行提供的命令。执行system ("cd somedir")
时,{child}会在子进程中执行,因此您的进程的工作目录保持不变。
如果您想更改流程工作目录,请使用chdir()
(或_chdir()
,或SetCurrentDirectory
(如果您要使用Windows API)功能。
或者,您可以通过将目录添加到文件名来避免更改工作目录。