如何读取以 C++ 结尾的不同行的文件
How to read file having different line ending in C++
我有两个文件“linuxUTF8.srt”和“macANSI.srt”。我正在使用 getline() 读取这些文件。
因为 macANSI.srt 有 '\r' 作为行尾,我正在读取整个文件而不是一行。
我知道我必须传递 '\r' 作为分隔符,但我怎么知道我正在处理的行结束字符的类型。
正如塞巴斯蒂安所说,我们需要阅读区块,然后找出合适的 line-ending。
因此,我们需要以二进制模式打开文件并读取最后一个字符。
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void SetLineEnding(char *filename, std::string &newline, char &delimiter)
{
std::string str;
std::ifstream chk(filename,std::ios::binary);
if(getline(chk, str))
{
if(str.size() && str[str.size()-1] == '\r')
{
//It can be either \r or \r\n
if(getline(chk, str))
{
delimiter = '\n';
newline = "\r\n";
}
else
{
delimiter = '\r';
newline = "\r";
}
}
else
{
delimiter = '\n';
newline = "\n";
}
}
}
int32_t main()
{
string newLine;
string delimiter;
char filename[256];
in>>filename;
SetLineEnding(filename,newLine,delimiter);
std::ifstream inp(filename,ios::in);
if(!inp.is_open())
{
cout<<"File not opened"<<endl;
return 0;
}
//getline() function with delimiter
string str;
getline(inp,str,delimiter);
return 0;
}
现在可以将定界符传给getline(),就可以按照line-ending读取了。
我有两个文件“linuxUTF8.srt”和“macANSI.srt”。我正在使用 getline() 读取这些文件。 因为 macANSI.srt 有 '\r' 作为行尾,我正在读取整个文件而不是一行。 我知道我必须传递 '\r' 作为分隔符,但我怎么知道我正在处理的行结束字符的类型。
正如塞巴斯蒂安所说,我们需要阅读区块,然后找出合适的 line-ending。
因此,我们需要以二进制模式打开文件并读取最后一个字符。
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void SetLineEnding(char *filename, std::string &newline, char &delimiter)
{
std::string str;
std::ifstream chk(filename,std::ios::binary);
if(getline(chk, str))
{
if(str.size() && str[str.size()-1] == '\r')
{
//It can be either \r or \r\n
if(getline(chk, str))
{
delimiter = '\n';
newline = "\r\n";
}
else
{
delimiter = '\r';
newline = "\r";
}
}
else
{
delimiter = '\n';
newline = "\n";
}
}
}
int32_t main()
{
string newLine;
string delimiter;
char filename[256];
in>>filename;
SetLineEnding(filename,newLine,delimiter);
std::ifstream inp(filename,ios::in);
if(!inp.is_open())
{
cout<<"File not opened"<<endl;
return 0;
}
//getline() function with delimiter
string str;
getline(inp,str,delimiter);
return 0;
}
现在可以将定界符传给getline(),就可以按照line-ending读取了。