我有一个文件,其中包含目录和子目录中所有文件的列表路径和其他相关信息。其部分内容最后给出。 我的问题是:
我试图读取此文件并打开列表中的所有文件,如下所示。他们都没有在开幕式上取得成功。
部分代码:
我使用strtok()
来删除文件信息的其他部分
char *token=NULL;
unsigned long file_size;
char file_fp[33];
char file_path[150];
char fname_buffer[1024];
char file_list[32];
std::cout<<"Enter file name containing the file list\n";
std::cin>>file_list;
FILE *flist=fopen(file_list,"r+b");
if(!flist)
{
std::cout<<"Could not open "<<file_list<<
" for reading\n Please rerun the program and enter the correct file name.";
return(1);
}
else while(fgets(fname_buffer,1024,flist))
{
// if ('\n' != fname_buffer[0])
token = strtok( fname_buffer," ,\t");
file_size=atol(token);
// if ('\n' != fname_buffer[0])
token = strtok(NULL, " ,\t");
strncpy((char*)file_fp,token,32);
// if ('\n' != fname_buffer[0])
token = strtok(NULL, "\n");
strcpy(file_path,token);
FILE *input_file=fopen(file_path, "r+b");
if(input_file == NULL)
{
fprintf(stderr,
"Could not open file %s for reading, error code %d!\n",
token,
errno);
continue;
}
........
部分file_list文件内容:
1883408 5291b5e9c117677f34fe39ac72983eba E:\ papers(ÃâÑ)ºSOA+ with + .NET + and + Windows + Azure00018.pdf
474231 a6f96231c62bd457c5f06201553a468f E:\ papers \ 06_un_ict_task_force_african_development_status.pdf
298547 4ba159f5b1123a89c118bb5814af13f9 E:\ papers \ 10.1.1.119.6128.pdf
1639991 a60672ae9f88c0c1ab2d33bac68572c6 E:\ papers \ 20100602_roger_mcilmoyle_sungard.pdf
501015 0d6a4cace5815c82a2627e52bb5ae6e9 E:\ papers \ a云存储多样性案例.pdf
还有更多:
如何从这些文件路径中删除文件扩展名,以便将它们用作文件名
编辑: 我得到的错误是
错误代码2,无法找到文件或目录
编辑:
这是我得到的实际输出
输入包含文件列表fileinfo.txt
的文件名无法打开 文件E:\ papers(├â├ó┬╖├æ)┬ú┬║SOA+ with + .NET +和+ Windows + Azure00018 .pdf 阅读,错误代码22!
无法打开文件 E:\ papers \ 06_un_ict_task_force_african_development_status.pdf for 阅读,错误代码22!
编辑: VC2010需要使用双斜杠代替目录遍历的单斜杠
答案 0 :(得分:2)
如果您在Windows上执行所有操作,并且您的文本文件(file_list
)具有Windows行结尾,则strtok无法拆分文件中的行(Windows行结尾为:\ r \ n):所以strtok会给你 file_path \ r 。
解决方案:以文本模式阅读文件列表文件:FILE *flist=fopen(file_list,"r+t")
我也会建议:
file_path
更长(至少256)strtok
返回的内容(如果文件中的某行没有足够的令牌,那么它可以返回 NULL ,然后你就会被抛弃:)。