C ++读取文件时提出三个女巫角色(C++ reading from file puts three

2019-06-24 03:04发布

当我从字符串文件中读取字符串,>>操作得到第一个字符串,但它与“我»¿我”开始。 假设第一个字符串为“街”,比它得到“我»¿istreet”。

其他字符串都还好。 我尝试了不同的txt文件。 其结果是一样的。 首先字符串开始以“我»¿我”。 问题是什么?

这里是我的代码:

#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);
    }   
}

}

Answer 1:

你看到一个UTF-8 字节顺序标记(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;
}


Answer 2:

参照由上述标记兰塞姆优异的答案,在现有的流添加此代码跳过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.
}


Answer 3:

这里是另外两个想法。

  1. 如果你是谁创建的文件之一,保存它们的长度与他们一起,和阅读它们时,只是削减所有的前缀,这个简单的计算:trueFileLength - savedFileLength = numOfByesToCut
  2. 保存文件时,阅读寻找它时,创建自己的前缀并删除所有你发现之前。


文章来源: C++ reading from file puts three weird characters