【问题标题】:CFile and CStdioFile Reading one byte at a timeCFile 和 CStdioFile 一次读取一个字节
【发布时间】:2014-05-28 11:31:39
【问题描述】:

在 Visual Studio 2008 中使用 C++ MFC,我正在尝试使用 CFile 或 CStdioFile 读取文本文档的最后一行,存储它,然后在文件修改文本后重新打印。

我已经让那部分工作了,唯一的问题是它不是动态的,无论最后一行有多长,您都必须手动创建一个偏移量。因此,我正在尝试创建一个函数来读取最后一行,直到它在将要使用的所有文件中找到一个公共元素,并计算有多少字节。这就是我现在所拥有的:

int MeasureLastTag(CStdioFile* xmlFile)
{
TCHAR lastTag[1];
CString tagBracket = _T("");
xmlFile->Seek(0, CFile::end);
int count = 0;

while(tagBracket != _T("<"))  //Go back two, read ahead one
{
    xmlFile->Seek(-2, CFile::current);
    xmlFile->Read(lastTag, 1);
    tagBracket = lastTag;
    count++;
}

return count;
}

但是,这会导致我似乎无法摆脱的无限循环。关于如何使其工作的任何想法?

附加信息,这是文件的示例。

<Station>
</Station>

我希望它读取,直到它到达

【问题讨论】:

    标签: c++ file-io cfile


    【解决方案1】:

    将 TCHAR lastTag[1] 更改为 char lastTag[1] 已解决该问题。

    【讨论】:

    • 在这种情况下有些事情是严重错误的。 CString 的支持类型应与 TCHAR 的类型匹配。
    • 当我用断点单步执行时,TCHAR lastTag[0] 总是返回 4 个空值,一个在第一次设置后从未改变的字符,然后是另一个空值。
    • 它是一个长度为 1 的数组。它不能有 4 个空值,除非您读取超出数组的末尾。
    • 这正是调试期间在 Visual Studio 的局部变量中吐出的内容。它注册为 4 个方格、一个随机字符和另一个方格。我说 NULL 的原因只是一个假设。
    • 你还没有初始化数组。它有垃圾值。结果,对Seek 的调用毫无意义。您要求它从末尾开始寻找垃圾字节数。 Seek 未填充数组。它返回一个值,您可能应该检查它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多