私はこのディレクトリツリーを持っています:
xy@xy:/test# find .
.
./2
./2/Asd
./2/Asd/qwe
./2/Asd/qwe/txt.txt
./1
「test」フォルダーには、4、5、6 などのディレクトリがさらに存在する可能性がありますが、asd、Asd、ASD、qwe、Qwe、QWE は一定です。目的は、次のようにすべての可能なパスを計算することです。
/test/1/ASD/QWE/txt.txt
/test/2/asd/qwe/txt.txt
/test/2/Asd/Qwe/txt.txt
その後、ファイル(txt.txt)を読み取ります
以下を作成(コピーして貼り付けて...)、しばらく動作しています。問題のある行をマークしました。
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
char *filetosearch="txt.txt";
char *test="/test/";
char *slash="/";
char *directory[3][3] = {{"asd", "Asd", "ASD"}, {"qwe","Qwe","QWE"}};
int dircounter1=0;
int dircounter2=0;
FILE *filetosf;
char **dirpatharr=NULL;
int dirpathcount=0;
char **hdarr=NULL;
int hdarrcount=0;
char **fullpath=NULL;
int count,size;
char *dirname;
DIR *d;
struct dirent *dir;
int main(void)
{
d = opendir(test);
if (d)
{
while ((dir = readdir(d)) != NULL)
{
if( dir->d_type==DT_DIR )
{
dirname=dir->d_name;
if((strcmp( dirname, ".." ) == 0) || (strcmp( dirname, "." ) == 0) )
{
}
else
{
hdarr=(char **)realloc(hdarr,(hdarrcount+1)*sizeof(dirname));
hdarr[hdarrcount]=dirname;
hdarrcount++;
}
}
else
{
}
}
}
closedir(d);
for (count=0; count<hdarrcount; count++ )
{
for (dircounter1 = 0; dircounter1 < 3; dircounter1++ )
{
for (dircounter2 = 0; dircounter2 < 3; dircounter2++ )
{
fullpath = malloc ( strlen(test) + strlen(hdarr[count]) + strlen(slash) + strlen(directory[0][dircounter2]) + strlen(slash) + strlen(directory[1][dircounter1]) + strlen(slash) + strlen(filetosearch)+1);
strcpy (fullpath,test);
strcat (fullpath,hdarr[count]);
strcat (fullpath,slash);
strcat (fullpath,directory[0][dircounter2]);
strcat (fullpath,slash);
strcat (fullpath,directory[1][dircounter1]);
strcat (fullpath,slash);
strcat (fullpath,filetosearch);
printf("fullpath:%s\n",fullpath);
// filetosf = fopen(fullpath,"r"); //THIS WILL BE THE PROBLEM!!!!
if (filetosf){
fseek (filetosf, 0L, SEEK_END);
size=ftell(filetosf);
fclose(fullpath);
printf("file exist:%s\n",fullpath);
}
free (fullpath);
}
}
}
}
- - - -ここでカット - - - - - - - - - -
この出力があります(私が望んでいたように):
fullpath:/test/2/asd/qwe/txt.txt
fullpath:/test/2/Asd/qwe/txt.txt
fullpath:/test/2/ASD/qwe/txt.txt
fullpath:/test/2/asd/Qwe/txt.txt
fullpath:/test/2/Asd/Qwe/txt.txt
fullpath:/test/2/ASD/Qwe/txt.txt
fullpath:/test/2/asd/QWE/txt.txt
fullpath:/test/2/Asd/QWE/txt.txt
fullpath:/test/2/ASD/QWE/txt.txt
fullpath:/test/1/asd/qwe/txt.txt
fullpath:/test/1/Asd/qwe/txt.txt
fullpath:/test/1/ASD/qwe/txt.txt
fullpath:/test/1/asd/Qwe/txt.txt
fullpath:/test/1/Asd/Qwe/txt.txt
fullpath:/test/1/ASD/Qwe/txt.txt
fullpath:/test/1/asd/QWE/txt.txt
fullpath:/test/1/Asd/QWE/txt.txt
fullpath:/test/1/ASD/QWE/txt.txt
しかし、コメント記号を削除してファイルを開く部分filetosf = fopen(fullpath,"r");
をアクティブにすると、ファイルを読み取ることができません。出力を確認すると、次のようになります。
fullpath:/test/2/asd/qwe/txt.txt
fullpath:/test//Asd/qwe/txt.txt
fullpath:/test//ASD/qwe/txt.txt
fullpath:/test//asd/Qwe/txt.txt
fullpath:/test//Asd/Qwe/txt.txt
fullpath:/test//ASD/Qwe/txt.txt
fullpath:/test//asd/QWE/txt.txt
fullpath:/test//Asd/QWE/txt.txt
fullpath:/test//ASD/QWE/txt.txt
fullpath:/test//asd/qwe/txt.txt
fullpath:/test//Asd/qwe/txt.txt
fullpath:/test//ASD/qwe/txt.txt
fullpath:/test//asd/Qwe/txt.txt
fullpath:/test//ASD/Qwe/txt.txt
fullpath:/test//asd/QWE/txt.txt
fullpath:/test//Asd/QWE/txt.txt
fullpath:/test//ASD/QWE/txt.txt
fopen
これは、表彰の前に行を印刷した場合でも発生します。なぜこうなった?
私は経験豊富なプログラマーではないので、簡単に説明してみてください。