我在模式' 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>>
请帮我解决错误的做法?因为在我之间我没有对流做任何事情所以为什么我得到这个输出?更重要的是我能做些什么来解决它?感谢
答案 0 :(得分:1)
使用fmemopen()
在内存中创建流时,会为其提供10000字节的缓冲区。写入时fflush()
不插入任何内容,它只会通知底层系统应将缓冲区写入存储区,在本例中为存储区。
然后当你倒带并开始阅读时fgets()
将返回非NULL值,只要它能读取内容即可。由于你的缓冲区是10000字节并且你没有写那么多,所以在数据之后会有随机噪声被读取。
您必须编写某种结束值以显示实际数据已结束。如果每一行都写有一些东西,那么标记的结尾可以像一个空字符一样简单,这使fgets()
读取一个空行,你可以简单地检查一下。