微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C 和 C++ 中奇怪的搜索行为

如何解决C 和 C++ 中奇怪的搜索行为

我的程序中的文件访问(windows)有一个奇怪的错误,其中一些文件索引计算不会指向文件中的正确符号。我可以隔离查找增量行为的错误并在两个循环中对其进行测试。曾经在 C 和 C++ 方式中。

在这两种情况下,我们打开一个文件,然后打印每个字符及其字符串表示。 我写了一个函数 to_string(char) 来打印字符或其名称,它是一个空格或一些不可见的东西。

首先是C方式:

    FILE* fptr = fopen("test.txt","r");
    while(!feof(fptr)){
        int seek = ftell(fptr);
        char c = fgetc(fptr);
        const char* s = to_string(c);
        printf("seek: %d,char: %s\n",seek,s); //Edit output is Now in C not in C++
    }
    fclose(fptr);

在下面的输出中,您会注意到搜索在每个“LF”处跳转,因此跳过了一些搜索。因此,seek 19、34、37 和 39 不知何故不会出现。我也尝试使用 fread() 函数代替 fgetc() 但输出没有改变。

Output:
seek: 0,char: f
seek: 1,char: n
seek: 2,char: 'SP'
seek: 3,char: m
seek: 4,char: a
seek: 5,char: i
seek: 6,char: n
seek: 7,char: 'SP'
seek: 8,char: -
seek: 9,char: >
seek: 10,char: 'SP'
seek: 11,char: a
seek: 12,char: s
seek: 13,char: c
seek: 14,char: i
seek: 15,char: i
seek: 16,char: 'SP'
seek: 17,char: {
seek: 18,char: 'LF'    <--- 
seek: 20,char: 'SP'    <--- what is this
seek: 21,char: 'SP'
seek: 22,char: 'SP'
seek: 23,char: 'SP'
seek: 24,char: r
seek: 25,char: e
seek: 26,char: t
seek: 27,char: u
seek: 28,char: r
seek: 29,char: n
seek: 30,char: 'SP'
seek: 31,char: 1
seek: 32,char: ;
seek: 33,char: 'LF'   <---
seek: 35,char: }      <---
seek: 36,char: 'LF'   <---
seek: 38,char: 'LF'   <---
seek: 40,char: 'EOF'

现在的 C++ 方式:

    std::ifstream file("test.txt");
    while(!file.eof()){
        int seek = file.tellg();
        char c = file.get();
        std::cout << "seek: " << std::to_string(seek) << ",char: " << to_string(c) << std::endl;
    }

在下面的输出中,您将看到,在每次出现 LF 时,查找不会跳跃 2,而是从第一个元素到第二个元素,查找随机跳跃 5,而不是增加 1。

Output
seek: 0,char: f    <---
seek: 5,char: n    <--- why?
seek: 6,char: 'SP'
seek: 7,char: m
seek: 8,char: a
seek: 9,char: i
seek: 10,char: n
seek: 11,char: 'SP'
seek: 12,char: -
seek: 13,char: >
seek: 14,char: 'SP'
seek: 15,char: a
seek: 16,char: s
seek: 17,char: c
seek: 18,char: i
seek: 19,char: i
seek: 20,char: 'SP'
seek: 21,char: {
seek: 22,char: 'LF'
seek: 23,char: 'SP'
seek: 25,char: 'SP'
seek: 26,char: 'SP'
seek: 27,char: r
seek: 28,char: e
seek: 29,char: t
seek: 30,char: u
seek: 31,char: r
seek: 32,char: n
seek: 33,char: 'SP'
seek: 34,char: 1
seek: 35,char: ;
seek: 36,char: 'LF'
seek: 37,char: }
seek: 38,char: 'LF'
seek: 39,char: 'LF'
seek: 40,char: 'EOF'

你知道为什么这些文件流的行为如此奇怪吗?

感谢您的帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。