c++ - 从使用 fmemopen() 打开的流中读取时的垃圾值

标签 c++ c raspberry-pi filestream

我在“w+”模式下使用 fmemopen() 打开了一个内存流。我在这个文件中写了一些数据,然后我试图读取数据来计数。写的行。但是我通过使用 fgets() 访问这个文件得到了垃圾值。我的代码很大,所以我只是在这里写了其中的一部分,让您了解我在做什么。

这是我打开流的方式:

char        buf_sn[10000];
size_t      len = 10000;

TokenStream = fmemopen(buf_sn, len, "w+");
    if (TokenStream == NULL) {
        printf("Unable to Open Token Stream for processing\n\r");
        return FALSE;
    }

这是我写入流的地方:

fprintf(TokenStream,"%.*s %d %ld\n",(tok_index_l), token_s, tok_type_l,line_no_l);
        printf("\nToken::%.*s\n",(tok_index_l),token_s);
        fflush (TokenStream);

现在,当我直接从缓冲区读取数据时,我得到了正确的输出:

printf ("\n\n\nbuf=\n%slen=%ld\n", buf_sn, len);

输出:

. 2 1
section 1 1
. 2 1
init 1 1
. 2 2
globl 1 2
_ 2 2
start 1 2
MOVI 1 4
R0 1 4
, 2 4
0x20000000 4 4
MOVI 1 5
R1 1 5
, 2 5
0x00200000 4 5
ORR 1 6
R0 1 6
, 2 6
R0 1 6
, 2 6
R1 1 6
, 2 6
0 1 6
MOVI 1 8
R1 1 8
, 2 8
0x00040000 4 8
STRI 1 9
R1 1 9
, 2 9
R0 1 9
, 2 9
4 3 9
MOVI 1 11
R1 1 11
, 2 11
0x00010000 4 11
loop 1 13
: 2 13
STRI 1 13
R1 1 13
, 2 13
R0 1 13
, 2 13
40 3 13
MOVI 1 15
R2 1 15
, 2 15
0 1 15
wait1 1 16
: 2 16
ADDI 1 16
R2 1 16
, 2 16
R2 1 16
, 2 16
1 3 16
CMPI 1 17
R2 1 17
, 2 17
0x00400000 4 17
BNE 1 18
wait1 1 18
STRI 1 20
R1 1 20
, 2 20
R0 1 20
, 2 20
28 3 20
MOVI 1 22
R2 1 22
, 2 22
0 1 22
wait2 1 23
: 2 23
add 1 23
r2 1 23
, 2 23
r2 1 23
, 2 23
# 2 23
1 3 23
CMPI 1 24
R2 1 24
, 2 24
0x00400000 4 24
BNE 1 25
wait2 1 25
BAL 1 27
loop 1 27

但是当我使用 fgets() 访问同一个流时,我在最后得到了垃圾:

rewind(TokenStream);        //Reset the TokenStream Pointer to the Start of the Stream.
    while(fgets(line_read_sn,sizeof(line_read_sn), TokenStream) != NULL) {
        printf("%ld>> %s\n",total_no_of_tokens_l, line_read_sn);
        total_no_of_tokens_l++;
    }

输出:

0>> . 2 1
1>> section 1 1
2>> . 2 1
3>> init 1 14>> . 2 2
5>> globl 1 2
6>> _ 2 2
7>> start 1 2
8>> MOVI 1 4
9>> R0 1 4
10>> , 2 4
11>> 0x20000000 4 4
12>> MOVI 1 5
13>> R1 1 5
14>> , 2 5
15>> 0x00200000 4 5
16>> ORR 1 6
17>> R0 1 6
18>> , 2 6
19>> R0 1 6
20>> , 2 6
21>> R1 1 6
22>> , 2 6
23>> 0 1 6
24>> MOVI 1 8
25>> R1 1 8
26>> , 2 8
27>> 0x00040000 4 8
28>> STRI 1 9
29>> R1 1 9
30>> , 2 9
31>> R0 1 9
32>> , 2 9
33>> 4 3 9
34>> MOVI 1 11
35>> R1 1 11
36>> , 2 11
37>> 0x00010000 4 11
38>> loop 1 13
39>> : 2 13
40>> STRI 1 13
41>> R1 1 13
42>> , 2 13
43>> R0 1 13
44>> , 2 13
45>> 40 3 13
46>> MOVI 1 15
47>> R2 1 15
48>> , 2 15
49>> 0 1 15
50>> wait1 1 16
51>> : 2 16
52>> ADDI 1 16
53>> R2 1 16
54>> , 2 16
55>> R2 1 16
56>> , 2 16
57>> 1 3 16
58>> CMPI 1 17
59>> R2 1 17
60>> , 2 17
61>> 0x00400000 4 17
62>> BNE 1 18
63>> wait1 1 18
64>> STRI 1 20
65>> R1 1 20
66>> , 2 20
67>> R0 1 20
68>> , 2 20
69>> 28 3 20
70>> MOVI 1 22
71>> R2 1 22
72>> , 2 22
73>> 0 1 22
74>> wait2 1 23
75>> : 2 23
76>> add 1 23
77>> r2 1 23
78>> , 2 23
79>> r2 1 23
80>> , 2 23
81>> # 2 23
82>> 1 3 23
83>> CMPI 1 24
84>> R2 1 24
85>> , 2 24
86>> 0x00400000 4 24
87>> BNE 1 25
88>> wait2 1 25
89>> BAL 1 27
90>> loop 1 27
91>> 
92>> 
93>> 
94>> 
95>> 
96>> 
97>> 
98>> 
99>> 
100>> 
101>> 
102>> 
103>> 
104>> 
105>> 
106>> 
107>> 
108>> 
109>> 
110>> 
111>> 
112>> 
113>> 
114>> 
115>> 
116>> 
117>> XA
118>> 
119>> 
120>> 
121>> `=
122>> 
123>> 
124>> *
125>> =
126>> t=
127>> 
128>> 
129>> 
130>> 

请帮我看看哪里做错了?因为我没有对流做任何事情,所以为什么我得到这个输出?更重要的是我能做些什么来修复它?谢谢

最佳答案

当您使用 fmemopen() 在内存中创建流时,您为它提供了一个 10000 字节的缓冲区。当你写入它时,fflush() 不会插入任何东西,它只会通知底层系统缓冲区应该写入存储,在本例中是内存。

然后当您倒带并开始阅读时,fgets() 将返回非 NULL 值,只要它可以读取某些内容。由于您的缓冲区是 10000 字节并且您没有写那么多,因此在您的数据之后会读取随机噪声。

您将不得不写一些结束值来表明实际数据已经结束。如果每一行都写了一些东西,那么结束标记可以像 nul 字符一样简单,这使得 fgets() 读取一个空行,你可以简单地检查它。

关于c++ - 从使用 fmemopen() 打开的流中读取时的垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34194240/

相关文章:

c++ - 仅使用函数打印 char 数组的一部分

python - 根据 C 中的条件将行从一个 csv 文件复制到另一个文件

linux - zImage 安装在 Raspberry PI 2 上

mysql - 为多个查询保持 MYSQL 连接功能

c++ - 删除指向同一事物的 2 个指针之一

c++ lex和bison对自制标记器/解析器的优势是什么

c - 使用 strftime 获取时间戳

python - 从命令行运行脚本时无法播放pygame.mixer声音

c++ - 关于调用约定的问题

c++ - C 明显比 C++ 快吗