C ++奇怪的文件输出

时间:2011-05-30 23:51:45

标签: c++

我正在尝试从一个简单的文本文件中读取。每当我运行程序时,它会打印出文件, 但是在打印出一堆乱码之前没有。有什么建议吗?

断章取义:

Φ#·  ├ï Uï∞ Φ╖   ≈╪←└≈╪YH]├ 5tδ╝
 abc    

Buffer.cc

//-----------------------------------------------------
//  TextInputBuffer  - Constructor for TextInputBuffer.
//-----------------------------------------------------
TextInputBuffer::TextInputBuffer(char *InputFileName)
{
    //--Open file. Abort if failed.
    InputFile.open(InputFileName, std::ios::in);
    if (!InputFile.good()) exit(1);
}

//-----------------------------------------------------
//  GetNextLine      - Get next line from input file.
//
//  Return: The first character of the next line.
//-----------------------------------------------------
char TextInputBuffer::GetNextLine()
{
    //--Get next line from input file.
if (InputFile.eof()) *ptrChar = eofChar;
else
{
    InputFile.getline(Text, MaxInputBufferSize);
    ptrChar = Text;
}

return *ptrChar;
}

//-----------------------------------------------------
//  GetNextChar      - Get next character from the text
//                     buffer.
//
//  Return: The next character in the text buffer.
//-----------------------------------------------------
char TextInputBuffer::GetNextChar()
{
    char ch;

    if      (*ptrChar == eofChar) ch = eofChar;
    else if (*ptrChar == eolChar) ch = GetNextLine();
    else
    {
        ++ptrChar;
        ch = *ptrChar;
    }

    return ch;
}

List.cc

TextInputBuffer InputBuffer(argv[1]);
char ch;

do {
    ch = InputBuffer.GetNextChar();

    if (ch == eolChar)
        std::cout << std::endl;

    std::cout << ch;
} while (ch != eofChar);

2 个答案:

答案 0 :(得分:2)

我会从一些惯用的代码开始阅读和显示您的数据。如果这不起作用那么你的输入文件很可能不包含你的预期。如果它确实有效,那么您所看到的问题就在现有代码中。

#include <iostream>
#include <string>

int main(int argc, char**argv) { 
    std::ifstream in(argv[1]);
    std::string line;

    while (std::getline(in, line))
        std::cout << line << "\n";
    return 0;
}

现在,你似乎正在使用iostreams,但是使用它们只是奇怪的是很难猜测你是否可能做错了什么,如果确实如此。在任何情况下,几乎所有的代码似乎都试图复制iostream(和streambuffers)已经做过的事情。如果你真的只想一次阅读一个角色,那就去做吧。试图写自己的缓冲是通常浪费时间;如果/它真的没有,你通常最好在实际的流缓冲区中编写缓冲代码,而不是作为iostream的包装器。

答案 1 :(得分:1)

我不认为它在打开文件后正在读取第一行,所以它从未初始化的行存储中取出垃圾字符,直到一个恰好是换行符,此时它实际上读取了第一行。