我正在尝试从一个简单的文本文件中读取。每当我运行程序时,它会打印出文件, 但是在打印出一堆乱码之前没有。有什么建议吗?
断章取义:
Φ#· ├ï 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);
答案 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)
我不认为它在打开文件后正在读取第一行,所以它从未初始化的行存储中取出垃圾字符,直到一个恰好是换行符,此时它实际上读取了第一行。