gpt4 book ai didi

c - readdir() 和 fgets 的问题

转载 作者:行者123 更新时间:2023-11-30 17:13:21 27 4
gpt4 key购买 nike

我正在编写一个代码,可以为我提供 .txt 文件的目录以及每个文件中出现的特定字符串,并进行一些简单的比较。代码块将在下面发布。

所以,我的任务:打开目录>打开文件>比较字符串>打开下一个文件(重复)直到我用完文件为止。

出了什么问题:我的代码当前无限打印第一个文件名(完整路径名),直到崩溃,没有任何内容打印到fp1。它应该只打印一次文件名,但它永远不会超过第一个文件,显然,我希望它遍历目录中的所有文件。

很抱歉,我对C还很陌生,所以我可能不清楚这些函数的实际操作方式。

如果我的理解有误,请指正,我想看看我的理解是否正确。

while ((in_file = readdir(FD))!= NULL){

基本上应该遍历目录并“查看”每个文件的名称。然后,我做了一些非常低效的工作,您可能会 mock 我,并且我设法获取目录中第一个文件的完整路径名。然后,我将该路径名分配给 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;
}

最佳答案

由于 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
}

关于c - readdir() 和 fgets 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30898133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com