C 使用fopen()读取工作不正常的文件
我是C语言的新手,学习如何读写作业中的文件。有人能给我解释一下为什么下面的函数有时能正确读取文件,有时会胡言乱语?我相信这与文件名有关。但是,我打印出了文件名,并且它保存了正确的字符串,所以我不知道为什么它有时有效,而其他时候不起作用,大多数时候不起作用 更新:用于正确测试文件是否打开并从头构建路径名的代码,以确保我传递的是字符串文本。输出有时是正确的,有时是无意义的C 使用fopen()读取工作不正常的文件,c,file,io,C,File,Io,我是C语言的新手,学习如何读写作业中的文件。有人能给我解释一下为什么下面的函数有时能正确读取文件,有时会胡言乱语?我相信这与文件名有关。但是,我打印出了文件名,并且它保存了正确的字符串,所以我不知道为什么它有时有效,而其他时候不起作用,大多数时候不起作用 更新:用于正确测试文件是否打开并从头构建路径名的代码,以确保我传递的是字符串文本。输出有时是正确的,有时是无意义的 void playGame(struct Room *HoldRooms[], char dirName[], char fil
void playGame(struct Room *HoldRooms[], char dirName[], char fileName[], int
roomStart)
{
//file and path name
char filePathName[100];
char tempString[100];
char string[MAX_STRING_LENGTH];
char field1[MAX_STRING_LENGTH];
char field2[MAX_STRING_LENGTH];
char field3[MAX_STRING_LENGTH];
filePathName[0] = 0;
char c;
strcpy(filePathName, dirName);
strcat(filePathName, "/");
strcat(filePathName, "room");
sprintf(tempString, "%d",roomStart);
strcat(filePathName,tempString);
//All lines contain three fields we will only need the third
FILE *fp = fopen(filePathName, "r");
chmod(filePathName, S_IRUSR | S_IRGRP | S_IROTH);
printf("The file is %s \n", filePathName);
if (fp == NULL) //If the file does not open
{
//fprintf(stderr, "Could not open %s\n", fileName);
//perror("in main");
printf("Could not open file\n" );
exit(1);
}
else
{
printf("Opened file %s \n", filePathName);
//fprintf(fp, "BLAH BLAH BLAH!");
fscanf(fp, "%s %s %s", field1, field2, field3);
printf("1: %s 2: %s 3: %s", field1, field2, field3);
}
fclose(fp); //close the file
}本测试
if (fp < 0) //If the file does not open
按照您的方式,空值将通过检查,而负文件指针可能有效,但检查失败。虽然您提到了一个特定的文件内容,但您也提到了文件,我怀疑您的意思是说一些文件名有效,而一些文件名无效:而不是一个文件有时会产生胡言乱语 如果fp<0,则更改为如果fp==NULL,尽管这可能是完整的解决方案。阅读fopen的手册页。该文件是否包含您试图读取的字符串格式?是的,它只是一个测试文件,上面写着文件室名称:CockpitI将我的测试修改为fp==NULL,它说文件已打开,但我从该文件中得到的信息毫无意义。我检查了存储文件的目录I,发现它们存在。在代码的前一部分中,每次运行程序时,文件都会更改。要打开的文件是随机选择的。@user2466886您没有检查chmod或fscanf的返回值。这些是基本和基本的安全措施。您现在正确地检查了fopen的结果,但位置不对:应该是在尝试打开文件后立即检查。我更改了代码,但它仍然抛出垃圾。不能将变量作为文件名传递吗?
if (fp == NULL) //If the file does not open