【问题标题】:Failure to open filename stored in string C++无法打开存储在字符串 C++ 中的文件名
【发布时间】:2017-05-19 22:48:00
【问题描述】:

我有一个代码可以从commands.in 读取文件名xxx 并将其存储在一个字符串中,称之为string name

我想打开xxx,因为它也是一个文件,所以我将.data 连接到它的末尾(因为我所有的文件都以.data 结尾)所以它可以像这样打开。

string filename = name + ".data";

现在我将该字符串输出到控制台,它显示为xxx.data,所以我知道它连接正确。但是,当我尝试使用该字符串打开文件时,我不断收到错误消息“文件不存在”。这就是我正在做的:

fstream fileObj;

fileObj.open(filename.c_str());(即xxx.data)这是说文件不存在。当我用它的实际名称fileObj.open("xxx.data"); 打开文件时,它发现文件没有问题并执行我想要的操作。我在.open 参数中输入的字符串与实际输入的字符串完全相同,但它不起作用。知道为什么会这样吗?

    #include <iostream>
#include <fstream>
#include <string>
//#include "Cache.h"

using namespace std;



double Avg(string fileName);
int Min(string fileName);
int Max(string filename);
int Med(string filename);




int main(){

  int numFile;
  string fileName;
  string opName;
  fstream fileObj;
  double avgVal;
  cout << "\n\n\n\n\n\n\n\n\n\n" << endl;
  fileObj.open("commands.in");

  fileObj >> numFile;


  for (int i = 0; i < numFile; i++){
    fileObj >> fileName;
    fileObj >> opName;



    if (opName == "Avg")
      {
        cout << "\n\nFilename = " << fileName<<endl;
        cout << "going for avg here"<<endl;
        avgVal = Avg(fileName);
        cout << avgVal;

  }

  return 0;
}

double Avg(string filename)
{
  cout << "ENTERED AVG METHOD" << endl;
  fstream file;
  string name = filename + ".data";
  // file.open(filename.c_str());
  file.open("A.data");
  if (file.fail())
    {
      cout << "The file was not found" << endl;
      return 0;
    }
  int count = 0;
  double allNum = 0;
  double current;
  double result;
  cout << "\nFilename goes here : " << name << endl;
  while(file)
    {
      file >> current;
      allNum += current;
      count +=1;
    }
  cout << "\n\n COUNT SHOULD BE 6 :  " << count << endl;

  result = allNum / count-1;

  return result;
}

commands.in

6
A Avg
B Max
C Med
A2 Avg
B Max
ABC Min

A.data

20
20
30
30
40
40

【问题讨论】:

  • 您可以在尝试打开文件之前打印您的name 以确认吗?...
  • 这个名字我之前打印过,完全一样。如果文件名是xxx.data,我会打印它以及连接,它们是相同的。

标签: c++ file-io concatenation


【解决方案1】:

检查以确保您正在使用的文件与当前工作目录位于同一目录中。您可能希望为fileObj.open(filename.c_str()); 提供绝对路径,例如:

string filename = "C:\\Users\\Username\\Desktop\\filename.data"

如果文件不存在于与当前工作目录相同的目录中,并且您没有提供完全限定的路径,则会不断弹出该错误。

另外,尝试硬编码文件名以确保字符串中没有任何行终止符:

fileObj.open("C:\\Users\\Username\\Desktop\\filename.data");

【讨论】:

  • 它是一台 Linux 机器,但是它们绝对在同一个目录中。这就是为什么输入它可以正常工作,但作为字符串传递却不能。
  • @JeffreyDilley 名称的来源无关紧要,它们的解释方式相同。而且它与可执行文件的目录无关,它与您当前的工作目录有关。
  • @Barmar 我明白这一点。我很肯定目录不是问题:/
  • @Jon 我将如何为我的 filename.c_str() 提供绝对路径,因为我只需要再次使用 c_str 来替换“filename.data”。?
  • @Jon 在 Linux 中是/
【解决方案2】:
  • 您是否忘记使用filename 而不是name

  • 您是否检查过您的 name 是否有尾随换行符?

记录它引用以确保您尝试打开正确的文件:

printf("filename: '%s'\n", filename.c_str());

这段代码看起来不对:

  string name = filename + ".data";
  // file.open(filename.c_str());
  file.open("A.data");

您的 commands.in 有 A.data 并且您附加 .data,然后您仍然使用 filename 而不是 name。相当混乱。全部改成这样:

  cout << "Open file: ==>\"" << name << "\"<==\n";
  file.open(name.c_str());

【讨论】:

  • 这里使用的名称是任意的。让我仔细检查一下我写的是什么意思..
  • 告诉你什么,我只是加载代码。给我一秒钟必须从 Linux vm 服务器传输
猜你喜欢
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2014-12-03
  • 2012-11-10
  • 2012-01-23
  • 1970-01-01
相关资源
最近更新 更多