有没有办法在C++中从文本文件中删除/修剪尾随的换行符?
例如:
例如:
content content
content content
content content
<- this line in the text file is empty and needs to go ->
content content
content content
content content
<- this line in the text file is empty and needs to go ->
#include <fstream>
#include <string>
// Add this code inside your main() function
std::ifstream ifs("filename.txt");
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
然后使用这里描述的任何技术:
然后,您可以使用新结果覆盖文件。当然,当处理非常大的文件(比如,2GB)时,这种方法不太实用,但根据您的原始问题,这样的事情并不是限制。
此线程还具有检测换行符的优秀材料。
ifstream fin("input.txt");
vector<string> vs;
string s;
while(getline(fin,s))
vs.push_back(s);
fin.close();
ofstream fout("input.txt");
for(vector<string>::iterator it = vs.begin(); it != vs.end(); ++it)
{
if(it != vs.begin())
fout << '\n';
fout << *it;
}
SetEndOfFile
或POSIX上的ftruncate
。例如:void RemoveFinalNewline(const char *filename)
{
#if defined(_WIN32)
HANDLE hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
; // handle error
LARGE_INTEGER fileSize;
if(GetFileSizeEx(hFile, &fileSize) == 0)
; // handle error
if(fileSize.QuadPart < 2)
; // this case is left as an exercise to the reader
LARGE_INTEGER newFilePtr;
newFilePtr.QuadPart = -2;
if(SetFilePointerEx(hFile, &newFilePtr, NULL, FILE_END) == 0)
; // handle error
char lastTwoBytes[2];
if(ReadFile(hFile, lastTwoBytes, 2, NULL, NULL) == 0)
; // handle error
if(lastTwoBytes[1] == '\n')
{
fileSize.QuadPart--;
if(lastTwoBytes[0] == '\r')
fileSize.QuadPart--;
if(SetFilePointerEx(hFile, &fileSize, NULL, FILE_BEGIN) == 0)
; // handle error
if(SetEndOfFile(hFile) == 0)
; // handle error
// Success!
}
// else the file didn't end in a newline
CloseHandle(hFile); // and we're done
#else // POSIX case; the non-Windows, non-POSIX case is left as an exercise
int fd = open(filename, O_RDWR);
if(fd == -1)
; // handle error
off_t fileSizeMinus1 = lseek(fd, -1, SEEK_END);
if(fileSizeMinus1 == (off_t)-1)
; // handle error
// We're assuming that a newline is a bare LF '\n' here. The CRLF case
// is left as an exercise (hint: see the Windows case above)
char lastChar;
if(read(fd, &lastChar, 1) != 1)
; // handle error
if(lastChar == '\n')
{
if(ftruncate(fd, fileSizeMinus1) == -1)
; // handle error
// else success!
}
// else the file does not end in a newline
close(fd); // and we're done
#endif
}
C++11或更高版本-删除尾随的空格(换行符,制表符,空格,...):
std::string readAndTrimTrailingSpaces(std::string const & filePath)
{
std::ifstream file(filePath);
std::string buffer(std::istreambuf_iterator<char>{file}, {});
while (!buffer.empty() && std::isspace(buffer.back()))
buffer.pop_back();
return buffer;
}
您可以创建一个简单的过滤器,应用如下:
remove_empty_last_line < input.txt > output.txt
或者,你可以自己创建文件输入流,如下:
#include <fstream>
std::ifstream myin(filename);
那么,代码应该类似于(未经测试)...
char c, d, e;
if (cin.get(c))
if (cin.get(d))
{
while (cin.get(e))
{
cout << d;
c = d;
d = e;
}
if (c != '\n' || d != '\n')
cout << d;
}
else
cout << c;