当我按字符串读取文件字符串时,>>操作得到第一个字符串,但它以“i”开头。假设第一个字符串是“street”,而不是“istreet”。
其他字符串也没关系。我尝试了不同的txt文件。结果是一样的。第一个字符串以“i”开头。有什么问题?
这是我的代码:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int cube(int x){ return (x*x*x);}
int main(){
int maxChar;
int lineLength=0;
int cost=0;
cout<<"Enter the max char per line... : ";
cin>>maxChar;
cout<<endl<<"Max char per line is : "<<maxChar<<endl;
fstream inFile("bla.txt",ios::in);
if (!inFile) {
cerr << "Unable to open file datafile.txt";
exit(1); // call system to stop
}
while(!inFile.eof()) {
string word;
inFile >> word;
cout<<word<<endl;
cout<<word.length()<<endl;
if(word.length()+lineLength<=maxChar){
lineLength +=(word.length()+1);
}
else {
cost+=cube(maxChar-(lineLength-1));
lineLength=(word.length()+1);
}
}
}
答案 0 :(得分:9)
你看到的是UTF-8 Byte Order Mark (BOM)。它是由创建文件的应用程序添加的。
要检测并忽略标记,您可以尝试使用此(未经测试的)函数:
bool SkipBOM(std::istream & in)
{
char test[4] = {0};
in.read(test, 3);
if (strcmp(test, "\xEF\xBB\xBF") == 0)
return true;
in.seekg(0);
return false;
}
答案 1 :(得分:1)
参考上面Mark Ransom的优秀答案,添加此代码会跳过现有流上的BOM(字节顺序标记)。打开文件后调用它。
// Skips the Byte Order Mark (BOM) that defines UTF-8 in some text files.
void SkipBOM(std::ifstream &in)
{
char test[3] = {0};
in.read(test, 3);
if ((unsigned char)test[0] == 0xEF &&
(unsigned char)test[1] == 0xBB &&
(unsigned char)test[2] == 0xBF)
{
return;
}
in.seekg(0);
}
使用:
ifstream in(path);
SkipBOM(in);
string line;
while (getline(in, line))
{
// Process lines of input here.
}
答案 2 :(得分:0)
这是另外两个想法。