【问题标题】:Using fopen() to read from a file not working correctly使用 fopen() 从无法正常工作的文件中读取
【发布时间】:2015-10-24 20:45:48
【问题描述】:

我是 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 (fp == NULL) 虽然这可能是完整的解决方案。阅读 fopen 的手册页。
  • 文件是否包含您要读取的格式,即“string string string”
  • 是的,它只是一个测试文件,上面写着 ROOM NAME: Cockpit

标签: c file io


【解决方案1】:

这个测试

if (fp < 0) //If the file does not open

不是测试文件是否打开的正确方法。如果fopen 无法打开文件,则返回NULL,这是您必须检查的内容。

if (fp == NULL) //If the file does not open

按照您的方式,NULL 值将通过您的检查,而“负”文件指针可能有效,但未通过您的检查。尽管您提到了一个特定的文件内容,但您也提到了“文件”,我怀疑您的意思是说某些文件名有效而某些无效:而不是一个文件有时会产生乱码。

【讨论】:

  • 我将测试修改为 fp == NULL,它说文件已打开,但我从文件中得到了废话。我检查了存储文件的目录,它们存在。该文件确实会随着程序的每次运行(在代码的前一部分中)发生变化,要打开的文件是随机选择的。
  • @user2466886 您没有检查来自chmod 或来自fscanf 的返回值,这些是基本和必要的保障措施。您现在正确地检查了fopen 的结果,但是在错误的地方:它应该在尝试打开文件后立即出现。
  • 我更改了我的代码,但它仍然在扔垃圾。不能把变量作为文件名传递吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多