gpt4 book ai didi

c++ - 我的fstream不好还是不好()?

转载 作者:太空狗 更新时间:2023-10-29 23:08:16 25 4
gpt4 key购买 nike

所以我有一个 .cpp 文件,它有一个函数,它接收一个文件名,并且应该返回一个包含文件内容的字符串(实际上修改了内容,我修改了代码以使其更容易理解,但是没有对我的问题有任何影响)。问题是 f.good()正在返回 false并且读取文件的循环不起作用。代码:

#include "StdAfx.h"
#include "Form21.h"
#include <string>
#include <fstream>
#include <iostream>



string ReadAndWrite(char* a){
char filename[8];
strcpy_s(filename,a);
string output;
char c;
ifstream f(filename,ios::in);
output+= "Example text"; // <-- this writes and returns just fine!
c = f.get();

while (f.good())
{

output+= c;
c= f.get();
}

return output;
}

有人知道为什么会这样吗?它有什么关系吗,这是一个单独的 .cpp 文件(当我删除 #include <fstream> 时它甚至没有抛出错误)。也许有一种不同的方法来制作循环?我会很高兴听到关于如何解决此问题的任何建议,可能是关于如何实现我的目标的不同方法。

最佳答案

首先,确实没有理由复制您收到的文件名——您可以按原样使用它。其次,几乎任何形式的循环 while (stream.good()), while (!stream.bad()), while (stream) 等,几乎肯定是错误的。您通常想要做的是检查读取某些数据是否有效。

或者,您可以完全跳过使用循环。有几种方法可以做到这一点。一个适用于较短文件的方法如下所示:

string readfile(std::string const &filename) { 
std::ifstream f(filename.c_str());
std::string retval;

retval << f.rdbuf();
return retval;
}

对于几十千字节(左右)的数据,它可以很好地工作,但在处理较大的文件时会开始变慢。在这种情况下,您通常希望使用 ifstream::read 来获取数据,大致如下:

std::string readfile(std::string const &filename) {
std::ifstream f(filename.c_str());

f.seekg(0, std::ios_base::end);
size_t size = f.tellg();

std::string retval(size, ' ');
f.seekg(0);
f.read(&retval[0], size);
return retval;
}

编辑:如果您需要处理单个字符(而不仅仅是读取它们),您有几个选择。一种是将其分成多个阶段,您在一个阶段读取所有数据,并在单独的阶段进行处理。另一种可能性(如果你只需要在处理过程中查看单个字符)是使用类似 std::transform 的东西来读取数据,进行处理,并将输出放入一个字符串中:

struct character_processor { 
char operator()(char input) {
// do some sort of processing on each character:
return ~input;
}
};

std::transform(std::istream_iterator<char>(f),
std::istream_iterator<char>(),
std::back_inserter(result),
character_processor());

关于c++ - 我的fstream不好还是不好()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10301288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com