C ++,向后读取串行输出文本文件

时间:2011-03-22 02:37:51

标签: c++

我正在使用串行终端(超级终端)来读取从微控制器连续写入并转储到文本文件的输入。我正在尝试创建一个C ++程序,它将从文本文件中读取整数到声明的变量。我感兴趣的数字位于文本文件的底部,所以我必须向后阅读。此外,当调用此函数时,它可以在写入文本文件的过程中的任何位置。例如,文本文件的最后三行可能是:

987 1002 856 751 454 875

1024 1000 987 998 945 667

465 454 15

从那里开始,我想把第二行的每个数字分配给它自己的变量。

我一直在考虑的一些方法是:

使用fseek指向结尾,但由于最后一行的随机性,我不知道要使用什么偏移量。

读入三行的块,通过换行符“\ n”识别中间行,并从那里读取6个值。 (不知道我将如何做到这一点,创建一个缓冲区并将其放入一个字符串?我可以自下而上吗?)我甚至可以在最后放置一个标识符字符,如“A”或其他东西每一行,如果这有助于搜索它。

感谢任何帮助!

感谢您的帮助,这是我们最终如何做到这一点,我们倒退并使用标志来绑定相关数据(100和200,但它们可能是任何东西),因为缓冲区对于我们需要的6个值有点过分抓住:

1 个答案:

答案 0 :(得分:2)

您可以使用fseek:只需在文件结束前稍微开始一点 - 任何两行的字节数都要多,同时确保在文件开始之前不要尝试读取 - 并读入缓冲区(您可以安全地将其向上舍入而不会降低性能 - 例如1k)。从换行符的最后一个字符向后扫描:表示它前面的行已完成(如果找不到,则表示第一行仍在写入,因此中止)。继续向后扫描,直到你找到另一个换行符(然后从它前进到行的开头)或者你在缓冲区的开头,在这种情况下,如果你从文件的开头读取,那么你知道这一行完成,否则中止。使用const char*和几个ifwhile循环可以轻松完成所有这些操作,然后使用sscanf来解析您的六个数字。

如果要使用C ++ istream,逻辑类似,但可以使用>>来解析整数值。

FILE* f = fopen(filename, "r");
if (!f) return false;
bool read_from_start_of_file;
if (read_from_start_of_file = (fseek(f, -1024, SEEK_END) != 0))
    rewind(f);
char buffer[1024];
size_t num_bytes_read = fread(f, 1, sizeof buffer, f);
if (num_bytes_read < 1)
    return false;
const char* p = buffer + num_bytes_read - 1;
// find end of last complete line...
for (; *p != '\n'; --p)
    if (p == buffer)
        return false; // line incredibly long or first line incomplete
// find start of previous line...
while (*--p != '\n')
    if (p == buffer)
        if (read_from_start_of_file)
            break;
        else
            return false;
if (*p == '\n') ++p; // skip forward to first actual character...
int a, b, c, d, e, f; // you can use an array if more convenient...
if (sscanf(p, "%d %d %d %d %d %d", &a, &b, &c, &d, &e, &f) != 6)
    return false;

// process your input...
...
return true; // it worked!