【问题标题】:fgets() doesn't correctly parse the data as I wantfgets() 没有按照我的意愿正确解析数据
【发布时间】:2021-12-29 02:52:19
【问题描述】:

我目前正在使用 fgets() 解析“.dat”文件,如下所示。

#include <iostream>

int main(int argc, char **argv) 
{
    FILE *fp = fopen( argv[1], "r+");   
    unsigned char pu8bufsend[256];
    printf("%s\n", argv[1]);    
    fseek(fp, 58, SEEK_SET);
    
    while(fgets((char*)pu8bufsend, 128*2, fp) != NULL)
    {
        for (size_t j = 0; j < 256; j++)
        {        
            printf("%02x , %d\n", pu8bufsend[j], j);        
        }
    }    
    
}

当我解析某个“.dat”文件时,前 20 个输出如下所示。

c0 , 0
a8 , 1
0a , 2
00 , 3
00 , 4
00 , 5
00 , 6
00 , 7
86 , 8
aa , 9
2b , 10
1d , 11
ff , 12
7f , 13
00 , 14
00 , 15
e8 , 16
7a , 17
40 , 18
00 , 19
00 , 20

但是,我应该从“.dat”文件中获取这个突出显示的部分。

这应该很简单,但不明白我为什么要为此苦苦挣扎。

谁能解决我的问题?

【问题讨论】:

  • 一个问题是数据包含空字节,这使得fgets() 成为该工作的错误工具。您可能需要使用fread();如果你小心点,你也许可以使用 POSIX getline()
  • 这是 C 还是 C++?
  • @JonathanLeffler 我刚刚尝试了 fread() 仍然没有用...这是用 C++ 编写的。
  • @JonathanLeffler。你怎么知道数据是否包含空字节?
  • 在你的文字图片中看到的数字是不是你要阅读的文件的内容(顺便说一句,这不是一个好主意,否则我现在可以在这里引用......)不是你试图阅读的文件的内容吗?其中第一个有问题的数字,即您没有进入输出的第一个数字是0x0D,从fgets() 的角度来看,这是回车。乔纳森所指的零也在那里....

标签: c++ c parsing fgets


【解决方案1】:

我注意到两件事:

  • 该文件包含一个 0d 0a 序列,这是一个 \r\n 对,一个 Windows 样式的行结尾。您的输出仅包含 0a,这意味着行尾转换生效。将“b”添加到您传递给fopen 的文件打开模式中。
  • 在行结束后,您的缓冲区包含随机垃圾。这是因为fgets 在换行符处停止读取,并将缓冲区的其余部分保持原样。您需要使用fread。现在,在您说的 cmets 中,您尝试过这个,但它“没有用”。您需要详细说明这一点。

【讨论】:

  • 这部分应该是评论......
  • 为什么?他们的问题的答案是“以二进制打开”和“使用 fread”。如果 fread 不起作用,那真的是一个单独的问题。
  • ""不起作用"。您需要详细说明这一点。"是要求澄清的教科书示例,应该进入评论。
猜你喜欢
  • 2023-03-04
  • 2014-02-10
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多