std :: string没有正确终止

时间:2013-10-01 20:12:17

标签: c++ string std outputstream fileoutputstream

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

class Application {
public:
    bool print() {
        out << "Content-Type: text/html; charset=utf-8\r\n\r\n";
        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,但也包含一些额外的字节垃圾。

1 个答案:

答案 0 :(得分:2)

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