std::string 未正确终止

std::string Not Getting Terminated Properly

本文关键字:终止 string std      更新时间:2023-10-16

当我通过调用ostream << string.c_str();std::string发送到输出流时,字符串未正确终止。这是为什么呢?

class Application {
public:
    bool print() {
        out << "Content-Type: text/html; charset=utf-8rnrn";
        std::ifstream inFileStream;
        inFileStream.open("./test.html");
        if(!inFileStream.is_open()) {
            out << "Error Opening File";
            return true;
        }
        boost::uintmax_t templateSize = boost::filesystem::file_size("./test.html");
        std::string output;
        char* templateData = new char[templateSize];
        char* bytePtr = templateData;
        inFileStream.read(templateData, templateSize);
        std::ofstream logFile;
        logFile.open("/tmp/test.log");
        while(*bytePtr != EOF) {
            if(*bytePtr ==  '{')
                readVar(&bytePtr, &output);
            else
                output.push_back(*bytePtr);
            bytePtr++;
        }
        delete[] templateData;
        output.push_back(0);
        logFile << output.c_str();
        return true;
    }
private:
    void readVar(char** bytePtrPtr, std::string* output) {
        while(**bytePtrPtr != EOF) {
            if(**bytePtrPtr == '}')
                return;
            output->push_back('*');
            (*bytePtrPtr)++;
        }
    }
};

这个(在日志文件内)的输出包括正确解析的test.html,但也有一些额外的字节垃圾。

读取

的数据不会由EOF终止。您从位于文件末尾和转换为EOF的第一个char之间的文件中转储了一些垃圾。一旦处理了n个字符,您应该停止向output添加字符的循环,其中n是调用inFileStream.read(...)的结果。