从使用fmemopen()打开的流读取时的垃圾值
Garbage Value Upon Reading from Stream opened using fmemopen()
我在"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 processingnr");
return FALSE;
}
这就是我向流写入的地方:
fprintf(TokenStream,"%.*s %d %ldn",(tok_index_l), token_s, tok_type_l,line_no_l);
printf("nToken::%.*sn",(tok_index_l),token_s);
fflush (TokenStream);
现在,当我直接从缓冲区读取数据时,我得到了正确的输出:
printf ("nnnbuf=n%slen=%ldn", 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>> %sn",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()
读取一个空行,你可以简单地检查它。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 从使用fmemopen()打开的流读取时的垃圾值