C++从文本文件中删除尾随新行
C++ 中有没有办法从文本文件中删除/修剪尾随的新行?
例如
content content
content content
content content
<- this line in the text file is empty and needs to go ->
Is there a way in C++ to remove/trim a trailing new line from a text file?
For example
content content
content content
content content
<- this line in the text file is empty and needs to go ->
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
当然!一种方法是 将文件读取到 std:: string
,然后使用此处描述的任何技术:
C++ 删除新的line from multiline string
然后您可以用新结果覆盖该文件。当然,这种方法在处理非常大的文件(比方说,2GB)时并不实用,但根据您原来的问题,这样的事情并不是一个限制。
这个线程也有关于检测新行的精彩材料。
Sure! One way to do it would be to read the file to a std::string
and then use any of the techniques described here:
C++ Remove new line from multiline string
then you could overwrite the file with the new result. Of course, this approach ain't practical when dealing with very large files (let's say, 2GB) but such thing is not a constraint according to your original question.
This thread also has great material on detecting new lines.
最有效的方法是查找文件末尾并将文件末尾指针向后移动。不幸的是,这不是可移植的,因为在 C 或 C++ 标准库中没有设置文件结束指针的标准方法。您需要使用特定于平台的函数,例如 Windows 上的
SetEndOfFile
或ftruncate
POSIX 上的 。例如:The most efficient method would be to seek to the end of the file and move the end-of-file pointer backwards. Unfortunately this is not portable because there is no standard way of setting the end-of-file pointer in either the C or C++ standard libraries. You need to use a platform-specific function such as
SetEndOfFile
on Windows orftruncate
on POSIX. For example:C++11 或更高版本 - 删除尾随空格(换行符、制表符、空格...):
C++11 or higher - removes trailing whitespaces (newlines, tabs, spaces, ...):
您需要从文件中读取所有内容,然后以不存在空行的方式或您想要的方式再次写入内容。
You need to read all the contents from file, and write the contents again in such a way that no empty line exists, or the way you want.
您可以创建一个简单的过滤器,如下所示应用:
或者,您可以创建自己的文件输入流 ala:
然后,代码将类似于(未经测试)...
(如果需要,请将 myin 替换为 cin,然后是 myin.close()) 。不需要使用 std::strings 来完成如此简单的事情:它们只会减慢一切。 C(以及 C++)的一大优势是能够一次有效地处理一个字符的数据。
You can create a simple filter, applied as in:
Or, you can create your own file input stream ala:
Then, the code would resemble (untested)...
(Substitute myin for cin if desired, then myin.close()). No need to use std::strings for something so simple: they just slow everything down. One of the great strengths of C (and hence C++) is being able to efficiently process data a character at a time.