之间有什么区别streampos和pos_type,streamoff并且off_type,除非他们被不同的定义.我应该用什么basic_stream<>::seek功能?
我以为会有这样的问题,但我找不到一个.所以这就是我的问题.
将整个文本文件读入字符串的最短方法是什么?我只想使用最新的C++标准和标准库的功能.
我认为这个共同的任务必须有一个班轮!
我需要一些关于删除txt文件中最后一个字符的帮助.例如,如果我的txt文件包含1234567,我需要C++代码删除最后一个字符,以便文件变为123456.谢谢大家.
我在阅读时发现了一些好的结果,例如:使用迭代器和预分配读取txt,或者读入容器.所以我想知道如何将最优雅的std :: string写入文件?
编辑:读取时我可以通过seek和tellg预先为字符串分配空间,因为我知道字符串的大小,我怎么能告诉文件系统我要写多少?
我目前这样做,最后转换为 std::string 需要 98% 的执行时间。一定会有更好的办法!
std::string
file2string(std::string filename)
{
std::ifstream file(filename.c_str());
if(!file.is_open()){
// If they passed a bad file name, or one we have no read access to,
// we pass back an empty string.
return "";
}
// find out how much data there is
file.seekg(0,std::ios::end);
std::streampos length = file.tellg();
file.seekg(0,std::ios::beg);
// Get a vector that size and
std::vector<char> buf(length);
// Fill the buffer with the size
file.read(&buf[0],length);
file.close();
// return buffer as string
std::string s(buf.begin(),buf.end());
return s;
}
Run Code Online (Sandbox Code Playgroud) 我正在创建一个IOManager类,其中我有一个函数来读取文件并将其存储在缓冲区中.这样做最有效的方法是什么?
我目前有2段代码:
bool IOManager::readFileToBuffer(std::string filePath, std::vector<unsigned char>& buffer) {
std::ifstream file(filePath, std::ios::binary);
if (file.fail()) {
perror(filePath.c_str());
return false;
}
//seek to the end
file.seekg(0, std::ios::end);
//Get the file size
int fileSize = file.tellg();
file.seekg(0, std::ios::beg);
//Reduce the file size by any header bytes that might be present
fileSize -= file.tellg();
buffer.resize(fileSize);
file.read((char *)&(buffer[0]), fileSize);
file.close();
return true;
}
Run Code Online (Sandbox Code Playgroud)
和
bool IOManager::readFileToBuffer(std::string filePath, std::vector<char>& buffer) {
std::ifstream file(filePath, std::ios::binary);
if (file.fail()) {
perror(filePath.c_str());
return false;
}
// copies all data into …Run Code Online (Sandbox Code Playgroud) 是否可以使用流使用c ++(stl)从命名管道(mkfifo)读取 - 因此没有事先char *buffer[MAX_SIZE]为读取操作定义?
我想读取,直到缓冲区结束并将结果放入std::string.
(当前方法:bytes = read(fd, buffer, sizeof(buffer));需要提前分配某种缓冲区.)
我想读取一个大型CSV文件并将其存储到地图中。我首先读取文件,然后查看处理需要多长时间。这是我的循环:
while(!gFile.eof()){
gFile >> data;
}
Run Code Online (Sandbox Code Playgroud)
我需要35分钟才能处理包含3500万行和6列的csv文件。有什么办法可以加快速度吗?对SO来说还很陌生,如果不能正确询问,请您道歉。
最近,我们要求有超过100,000个xml文件,并且所有这些文件都需要修改xml中的特定数据.简单的perl命令可以完成这项工作,但perl没有安装在文件所在的机器上.因此我写了一个小的C#代码来完成这项工作.
private static void ModifyXML(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
string path = @args[0];
string opath = @args[1];
string token = "value_date=\"20121130\"";
string target = "value_date=\"20121019\"";
Parallel.ForEach(Directory.EnumerateFiles(path), (file) =>
{
StringBuilder sb = new StringBuilder(File.ReadAllText(file));
sb.Remove(0, 55);
sb.Replace(token, target);
var filename = file.Split(new char[] { '\\' }).Last();
File.WriteAllText(string.Format("{0}\\{1}", opath, filename), sb.ToString());
});
TimeSpan ts = sw.Elapsed;
Console.WriteLine("Took {0} secs", ts.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)
我决定实现C++版本.事实证明,C++版本并没有明显快于C#版本.在两个版本中运行了一段时间.实际上,它在某些运行期间和C#版本一样快.
对于C#,我使用的是.NET 4.0,而对于C++,它使用的是VC10.
void FileHandling(std::string src, std::string dest)
{
namespace fs = boost::filesystem;
auto start = …Run Code Online (Sandbox Code Playgroud) 我创建了一个名为FileReader的类.这是我在这个班级的阅读功能.它打开一个文件并读取它.当然,它将文件的内容放在我的类的"内容"变量中.它在最后一行.
std::string file_content;
std::string temp;
std::ifstream file;
file.open(filepath,std::ios_base::in);
while(!file.eof()){
temp.clear();
getline(file, temp);
file_content += temp;
file_content += '\n';
}
file_content = file_content.substr(0, file_content.length()-1); //Removes the last new line
file.close();
content = file_content;
Run Code Online (Sandbox Code Playgroud)
我打开的文件包含以下内容:
"你好\n什么事了?nCool".
当然我没有在我的文本文件中完全写出\n.但正如你所看到的那样,最后没有新的界限.
我的问题是,每当我将它打印到屏幕上时,"内容"都会在最后添加一个新行.但我删除了最后一个新行...出了什么问题?
c++ ×10
file ×3
string ×3
c++11 ×2
file-io ×2
text-files ×2
c# ×1
c++14 ×1
csv ×1
large-files ×1
linux ×1
named-pipes ×1
parsing ×1
ppl ×1
text ×1