我正在编写一个代码,我可以在其中获得.txt文件的目录,以及每个文件中出现的特定字符串,并进行一些简单的比较。代码块将在下面发布。
所以,我的任务:打开目录>打开文件>比较字符串>打开下一个文件(重复) 直到我用完文件。
有什么问题:我的代码当前无限打印第一个文件名(完整路径名),直到它崩溃,没有任何内容打印到fp1
。它应该只打印一次文件名,但它永远不会超过第一个文件,显然,我希望它能够遍历目录中的所有文件。
对不起,我是 C 的新手,所以我可能不清楚这些功能的实际运作方式。
如果我错了,请纠正我,我想知道我是否理解正确。
while ((in_file = readdir(FD))!= NULL){
应该基本遍历一个目录并且"看看"每个文件的名称。
然后我做了一些非常低效的工作,你可能会嘲笑我,我设法得到目录中第一个文件的完整路径名。
然后我将该路径名指定给entry_file
指针,由fgets()
打开。
我相信fgets()
应该单独读取每一行,直到它看到一个EOF字符
现在,在我添加目录内容之前,我已经开始使用此部分了,我只是使用fopen()
打开一个文件并使用其完整路径名称,但我还没有触及它。所以我不认为我的问题在这里,但根本没有打印到fp1
,所以我真的不知道。
然后我做一些简单的字符串比较并尝试将匹配打印到fp1
当它到达文件末尾时,它应该关闭文件,然后返回到readdir()
并使用下一个文件重复该过程
非常感谢您的帮助。我可能听起来像个白痴,但我不知道是什么原因引起的。
是的,我意识到它非常混乱,我有许多未使用和无意义的变量。我已经试图解决这个问题好几天了,尝试了很多不同的方法。
int main(void)
{
char str1[10000];
char str2[] = { "Measure L1 current Tank Heater ON: Passed" };
char str3[] = { "Measure L1 current Tank Heater ON: Failed" };
char str4[] = { "Measure L1 current Manifold Heater ON: Passed" };
char str5[] = { "Measure L1 current Manifold Heater ON: Failed" };
char str6[] = { "Measure L1 current (verify heaters off) Manifold: Passed" };
char str7[] = { "Measure L1 current (verify heaters off) Manifold: Failed" };
char sn[] = { "Serial Number: 1" };
DIR* FD;
struct dirent* in_file;
int lcount = 0;//line counter
char *ret;
int linenum = 0;//temp line count
char mes[500];//measurement
double val = 0;//value
char unit[500];//units
char pathstr1[38] = ("C:/Users/liam.king/Desktop/TestFiles/");
char pathstr2[200];
DWORD retval = 0;
char buffer[BUFSIZE] = ("");
char buf[BUFSIZE] = ("");
char** lppPart = {NULL};
FILE *fp, *fp1, *filewrite;
FILE *entry_file;
//fp = fopen("C:/Users/liam.king/Desktop/TestFiles/ProBlueUnit_UpgradeRev4_Report[1022230.SA15E14082][9 39 00 AM][5 19 2015].txt", "r");
fp1 = fopen("C:/Users/liam.king/Desktop/ProBlueTestWrite.txt", "a");
filewrite = fopen("C:/Users/liam.king/Desktop/FileWrite.txt", "w+");
if (fp1 == NULL){
printf("Invalid file name");
return 0;
}
if ((FD = opendir(LONG_DIR_NAME))==NULL)
{
printf("Error: Failed to open directory\n");
return 0;
}
else{
printf("Directory opened successful\n");
}
while ((in_file = readdir(FD))!= NULL){
if (strcmp(in_file->d_name, ".") == 0 || strcmp(in_file->d_name, "..") == 0)
continue;
fprintf(filewrite, "%s", pathstr1);
fprintf(filewrite,"%s", in_file->d_name);
fclose(filewrite);
filewrite = fopen("C:/Users/liam.king/Desktop/FileWrite.txt", "r");
fscanf(filewrite, "%[^\n]%*c", pathstr2);
printf("%s\n", pathstr2);//check file name is correct
entry_file = fopen(pathstr2, "r");
fclose(filewrite);
if (entry_file != NULL){
//printf("SUCCESSFULL OPENING\n");
//fprintf(fp1, "Does this work?\n");
}
else if (entry_file == NULL){
printf("Error: Failed to open entry file\n");
return 0;
}
while (fgets(buffer, 256, entry_file) != NULL){//string being stored in str1 from file *entry_file
lcount++;
ret = strstr(str1, sn);
if (ret != NULL){
fprintf(fp1, "%s\n", str1);
}
ret = strstr(str1, str2);
if (ret != NULL){// compares str1 and 2
fprintf(fp1, "Found"" %s ""at line %d\n", str1, lcount);//if same, declare match and what line found at.
linenum = lcount;
}
//comparing more strings
}
fclose(entry_file);
}
fclose(fp1);
return 0;
}
答案 0 :(得分:0)
由于pathstr2
被声明为本地数组,因此您应该使用:
while ((in_file = readdir(FD)) != NULL) {
if (!strcmp(in_file->d_name, ".") || !strcmp(in_file->d_name, ".."))
continue;
snprintf(pathstr2, sizeof(pathstr2), "%s%s", pathstr1, in_file->d_name);
entry_file = fopen(pathstr2, "r");
...
while (fgets(buffer, sizeof(buffer), entry_file) != NULL) {
lcount++;
if (strstr(buffer, sn)) {
fprintf(fp1, "%s", buffer);
}
if (strstr(buffer, str1)) {
fprintf(fp1, "Found \"%s\" at line %d\n", str1, lcount);
linenum = lcount;
}
...
}
fclose(entry_file);
}
您从strstr
读取的行上使用entry_file
执行的测试不正确。您应该指定buffer
而不是str1
作为第一个参数。
另请注意,strstr
搜索整行中的第二个字符串。如果字符串应该从行的开头开始,你应该写:
if (!strncmp(buffer, str1, strlen(str1))) {
// line starts with str1
}