C++流输出不起作用



有人可以告诉我为什么这不起作用吗?这个东西只是不想将数据写入文件。输入正常。fout.open("Dats.txt", std::ios::out | std::ios::app);也不起作用。

std::ifstream fin;
std::fstream fout;
fin.open("Dats.txt");
fout.open("C:/Users/Shantykoff/Documents/visual studio 2017/Projects/Input_Output_fstream_basis/Input_Output_fstream_basis/Dats.txt",
std::ios::out | std::ios::app);

有问题的一段代码:

void inputData() {
Data temp;
std::cout << "Inserisci xn";
std::cin >> temp.x;
fout << temp.x << "n";
}

在代码的这一部分中:

void inputData() {
Data temp;
std::cout << "Inserisci xn";
std::cin >> temp.x;
fout << temp.x << "n";
}

最后一行有一个名为fout的变量,该变量具有此函数的本地作用域,该函数未在此代码块中的任何位置或在此作用域内声明。您有两个选项可以解决此问题,除非您在未指定的 main 函数之外的全局范围内声明此对象:

  • 您可以在此函数中创建std::ofstream临时对象,但您必须openclose文件流。
  • 或者,您可以通过reference此函数来传递ofstream object

我将展示每个示例:

void inputData() {
Data temp;
std::cout << "Iserisci xn";
std::cin >> temp.x;
std::ofstream fout;
fout.open( /* filename & path */ );
fout << temp.x << "n"; 
}

void inputData( std::ostream& out ) {
Data temp;
std::cout << "Iserisci xn";
std::cin >> temp.x;
out << temp.x << "n";
}

然后在调用此函数的代码块中,您可以执行...

{
//... some other code
std::ofstream fout;
fout.open( "path & filename", flags );
inputData( fout );
fout.close();
//... some other code
}

如果您仔细注意到此函数,我传递了对std::ostream对象的引用,而不是std::ofstream对象。我为什么选择这样做?这很简单,因为此函数现在可以接受任何输出流类型对象,而不仅仅是输出文件流对象......

{    
inputData( std::cout ); // will now print to console out
std::ostringsream ostr;
inputData( ostr ); // will now populate the output string stream object
// etc...
}

基本上把这行代码:fout << temp.x << "n";在你的函数上面的fout对象不会在此代码块的范围内声明或定义,除非fout是否位于main函数之外的全局命名空间中。


编辑- 可选,但作为以下代码行的旁注:

fout.open("C:/Users/Shantykoff/Documents/visual studio 2017/Projects/Input_Output_fstream_basis/Input_Output_fstream_basis/Dats.txt",
std::ios::out | std::ios::app);

自从你使用Visual Studio以来,我通常会做的是这样的:

在解决方案资源管理器中的当前项目设置下:

  • 在配置属性下 - 用于当前配置和平台设置
    • 常规
      • 输出目录:设置为 -$(解决方案目录)"项目名称"\_build\
    • 调试
      • 工作目录:设置为 -$(项目目录)_build\

注意:">项目名称"只是项目实际名称的占位符。

这样,您就不必从根目录指定整个路径C:

然后在您的代码中,当您有如下文件时:

sample.txt- 放置在可执行文件现在将驻留的_build文件夹中,而不是"Visual Studio"的默认位置。

1 2 3 4 5 6 7 8 9

主.cpp

int main() {
std::vector<unsigned> values;
std::ifstream in;
unsigned val;
in.open( "sample.txt" );
while ( in >> val ) {
values.push_back( val );
}
in.close();
// lets modify some values
for ( auto v : values ) {
v *= 10;
}
// Let's print new values to same file but lets append it to a new line
std::ofstream out;
out.open( "sample.txt", std::ios::app );
for ( auto v : values ) {
out << "n";
out << v << " ";
}
out.close();
return 0;
}

样品.txt

1 2 3 4 5 6 7 8 9
10 20 30 40 50 60 70 80 90

现在,通过在解决方案资源管理器中创建_build文件夹,它使长路径的代码读取更容易阅读,因为这些路径现在相对于项目的目录,并且应该指向将包含应用程序可执行文件以及任何第三方依赖项的同一文件夹 - 外部dlls。现在就我自己而言,我选择在build文件夹名称的前面放置一个underscore,只是为了使其靠近其父目录的top

最新更新