Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用fopen()读取工作不正常的文件_C_File_Io - Fatal编程技术网

C 使用fopen()读取工作不正常的文件

C 使用fopen()读取工作不正常的文件,c,file,io,C,File,Io,我是C语言的新手,学习如何读写作业中的文件。有人能给我解释一下为什么下面的函数有时能正确读取文件,有时会胡言乱语?我相信这与文件名有关。但是,我打印出了文件名,并且它保存了正确的字符串,所以我不知道为什么它有时有效,而其他时候不起作用,大多数时候不起作用 更新:用于正确测试文件是否打开并从头构建路径名的代码,以确保我传递的是字符串文本。输出有时是正确的,有时是无意义的 void playGame(struct Room *HoldRooms[], char dirName[], char fil

我是C语言的新手,学习如何读写作业中的文件。有人能给我解释一下为什么下面的函数有时能正确读取文件,有时会胡言乱语?我相信这与文件名有关。但是,我打印出了文件名,并且它保存了正确的字符串,所以我不知道为什么它有时有效,而其他时候不起作用,大多数时候不起作用

更新:用于正确测试文件是否打开并从头构建路径名的代码,以确保我传递的是字符串文本。输出有时是正确的,有时是无意义的

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