file.txt的内容是:
5 3
6 4
7 1
10 5
11 6
12 3
12 4
Run Code Online (Sandbox Code Playgroud)
5 3坐标对在哪里.如何在C++中逐行处理此数据?
我能够得到第一行,但是如何获得文件的下一行?
ifstream myfile;
myfile.open ("text.txt");
Run Code Online (Sandbox Code Playgroud) 我需要将整个文件读入内存并将其放在C++中std::string.
如果我把它读成a char[],答案很简单:
std::ifstream t;
int length;
t.open("file.txt"); // open input file
t.seekg(0, std::ios::end); // go to the end
length = t.tellg(); // report location (this is the length)
t.seekg(0, std::ios::beg); // go back to the beginning
buffer = new char[length]; // allocate memory for a buffer of appropriate dimension
t.read(buffer, length); // read the whole file into the buffer
t.close(); // close file handle
// ... Do stuff with buffer here ...
Run Code Online (Sandbox Code Playgroud)
现在,我想做同样的事情,但是使用a std::string而不是a char[] …
在像Perl这样的脚本语言中,可以一次将文件读入变量.
open(FILEHANDLE,$file);
$content=<FILEHANDLE>;
Run Code Online (Sandbox Code Playgroud)
在C++中最有效的方法是什么?
我想std::string用c ++ 读取文本文件的全部内容到一个对象.
使用Python,我可以写:
text = open("text.txt", "rt").read()
Run Code Online (Sandbox Code Playgroud)
它非常简单而优雅.我讨厌丑陋的东西,所以我想知道 - 用C++读取文本文件最优雅的方法是什么?谢谢.
在C++缓冲区中读取整个文件内容的好方法是什么?
虽然在普通CI中可以使用fopen(), fseek(), fread()函数组合并将整个文件读取到缓冲区,但对C++使用它仍然是个好主意吗?如果是,那么我怎样才能在打开时使用RAII方法,为缓冲区分配内存,读取和读取文件内容到缓冲区.
我应该为缓冲区创建一些包装类,它在它的析构函数中释放内存(分配给缓冲区),以及用于文件处理的相同包装器吗?
我需要将文件复制到字符串中.我需要为该字符串对象预先分配内存以及直接将文件内容读入该字符串内存的方法吗?
我做了一个示例项目,将文件读入缓冲区.当我使用tellg()函数时,它给我一个比读取函数实际读取的值更大的值.我认为有一个错误.
这是我的代码:
编辑:
void read_file (const char* name, int *size , char*& buffer)
{
ifstream file;
file.open(name,ios::in|ios::binary);
*size = 0;
if (file.is_open())
{
// get length of file
file.seekg(0,std::ios_base::end);
int length = *size = file.tellg();
file.seekg(0,std::ios_base::beg);
// allocate buffer in size of file
buffer = new char[length];
// read
file.read(buffer,length);
cout << file.gcount() << endl;
}
file.close();
}
Run Code Online (Sandbox Code Playgroud)
主要:
void main()
{
int size = 0;
char* buffer = NULL;
read_file("File.txt",&size,buffer);
for (int i = 0; i < size; i++) …Run Code Online (Sandbox Code Playgroud) 我想把一个文件读成一个字符串.我正在寻找有效的方法.
使用固定大小的*char缓冲区
我收到了Tony 的回答是什么创建了一个16kb的缓冲区并读入该缓冲区并附加缓冲区,直到没有其他内容可读.我理解它是如何工作的,我发现它非常快.我不明白的是,在答案的评论中,据说这种方式将所有内容复制两次.但据我所知,它只发生在内存中,而不是发生在磁盘上,所以它几乎是不可察觉的.它是从缓冲区复制到内存中的字符串的问题吗?
使用istreambuf_iterator
我收到的另一个答案是使用istreambuf_iterator.代码看起来美观而且极小,但速度极慢.我不知道为什么会这样.为什么那些迭代器这么慢?
使用memcpy()
对于这个问题,我收到的评论是我应该使用memcpy(),因为它是最快的本机方法.但是如何将memcpy()与字符串和ifstream对象一起使用?是不是ifstream应该使用自己的读取功能?为什么使用memcpy()破坏可移植性?我正在寻找与VS2010以及GCC兼容的解决方案.为什么memcpy()不适用于那些?
+还有其他任何有效的方法吗?
对于小的<10 MB二进制文件,你推荐什么,我使用什么shell?
(我不想将这个问题分成几部分,因为我对如何将ifstream读入字符串的不同方式之间的比较更感兴趣)
我正在做一些非常简单的事情:将整个文本文件从磁盘中抹去std::string.我目前的代码基本上是这样的:
std::ifstream f(filename);
return std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
Run Code Online (Sandbox Code Playgroud)
它不太可能对程序产生任何性能影响,但我仍然很好奇这是否是一种缓慢的方式.
是否存在构造字符串将涉及大量重新分配的风险?在读取之前使用seekg()/ tellg()计算文件大小和reserve()字符串中的那么多空间会更好(也就是说更快)吗?
我以为会有这样的问题,但我找不到一个.所以这就是我的问题.
将整个文本文件读入字符串的最短方法是什么?我只想使用最新的C++标准和标准库的功能.
我认为这个共同的任务必须有一个班轮!