C++ 无法打开存储在字符串C++;

C++ 无法打开存储在字符串C++;,c++,file-io,concatenation,C++,File Io,Concatenation,我有一个代码,可以从命令中读取文件名xxx。在中,将其存储在字符串中,我们称之为string name 我想打开xxx,因为它也是一个文件,所以我将.data连接到它的末尾(因为我所有的文件都以.data结尾),这样就可以像这样打开它 stringfilename=name+“.data” 现在我将该字符串输出到控制台,它读取xxx.data,因此我知道它连接正确。但是,当我尝试使用字符串打开文件时,我不断收到错误消息“文件不存在”。这就是我正在做的: fstream文件对象 fileObj.o

我有一个代码,可以从
命令中读取文件名
xxx
。在
中,将其存储在字符串中,我们称之为
string name

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

stringfilename=name+“.data”

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

fstream文件对象

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;
}
A.data

20
20
30
30
40
40
  • 您是否忘记使用
    文件名而不是
    名称

  • 您是否检查了您的
    名称
    是否有尾随新行字符

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

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

此代码看起来不正常:

  string name = filename + ".data";
  // file.open(filename.c_str());
  file.open("A.data");
您的
命令.in
中有一个.data,您添加了
.data
,然后您仍然使用
文件名
,而不是
名称
。相当混乱。将其全部更改为:

  cout << "Open file: ==>\"" << name << "\"<==\n";
  file.open(name.c_str());
cout
  • 您是否忘记使用
    文件名而不是
    名称

  • 您是否检查了您的
    名称
    是否有尾随新行字符

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

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

此代码看起来不正常:

  string name = filename + ".data";
  // file.open(filename.c_str());
  file.open("A.data");
您的
命令.in
中有一个.data,您添加了
.data
,然后您仍然使用
文件名
,而不是
名称
。相当混乱。将其全部更改为:

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

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

string filename=“C:\\Users\\Username\\Desktop\\filename.data”

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

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


fileObj.open(“C:\\Users\\Username\\Desktop\\filename.data”)

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

string filename=“C:\\Users\\Username\\Desktop\\filename.data”

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

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



fileObj.open(“C:\\Users\\Username\\Desktop\\filename.data”)

在您尝试打开文件之前,是否可以打印您的
名称
,以确保安全?。我以前打印过名称,并且名称完全相同。如果文件名为
xxx.data
我将打印该文件以及连接,并且它们是相同的。在您尝试打开文件之前,是否可以打印您的
名称
,以确保?。我以前打印过名称,并且名称完全相同。如果文件名是xxx.data,我会打印它和连接,它们是相同的。这里使用的名称是任意的。让我仔细检查一下我写的是什么意思……告诉你,我只加载代码。请给我一点时间,我必须从Linux虚拟机服务器传输。这里使用的名称是任意的。让我仔细检查一下我写的是什么意思……告诉你,我只加载代码。给我一点时间,我必须从Linux虚拟机服务器传输它是一台Linux机器,但它们绝对在同一个目录中。这就是为什么输入正确,但作为字符串传递不正确的原因。@JeffreyDilley名称来自何处并不重要,它们的解释方式相同。它不是相对于可执行文件的目录,而是相对于您当前的工作目录。@Barmar我理解。我肯定目录不是问题所在:/@Jon如果我只需要再次使用c_str来替换“filename.data”,我如何为我的filename.c_str()提供一个绝对路径?@Jon在Linux中它是
/
它是一台Linux机器,但是的,它们绝对在同一个目录中。这就是为什么输入正确,但作为字符串传递不正确的原因。@JeffreyDilley名称来自何处并不重要,它们的解释方式相同。它不是相对于可执行文件的目录,而是相对于您当前的工作目录。@Barmar我理解。不过,我肯定目录不是问题所在:/@Jon如果我只需要再次使用c_str来替换“filename.data”,我如何为我的filename.c_str()提供一个绝对路径?@Jon在Linux中它是
/