- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在“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/
我正在尝试使用 fmemopen 函数将可执行文件的 char* 映射到内存中,该函数应该返回一个 FILE * 以便能够使用它(根本无需将其写入硬盘)。 fmemopen 函数更改文件的问题,因此当
我在“w+”模式下使用 fmemopen() 打开了一个内存流。我在这个文件中写了一些数据,然后我试图读取数据来计数。写的行。但是我通过使用 fgets() 访问这个文件得到了垃圾值。我的代码很大,所
我正在尝试从使用 fmemopen 和 char * 创建的流中读取宽字符。 char *s = "foo bar foo"; FILE *f = fmemopen(s,strlen(s),"r");
我正在使用 fmemopen 创建一个变量 FILE* fid 以将其传递给一个从打开的文件中读取数据的函数。 在该函数的某处,它使用以下代码找出文件的大小: fseek(fid, 0, SEEK_E
我无法让 fmemopen 一致地打印到 cstring。做这样的事情: #include #include int main(void) { char buf[256]; FIL
我有以下代码: char *filedata; FILE *f; filedata = malloc(3); if (filedata == NULL) { fprintf(stderr, "
我在 Linux 中有一个 fmemopen 文件描述符(指向父缓冲区),我希望能够在 C 中将此文件描述符设置为子进程的标准输入(我不为子进程设置)可以访问代码) 这可能吗?如果是这样,我该怎么做?
在阅读 string streams 上的 GNU 文档时我发现了两个相似的函数,它们做的事情非常相似: FILE * fmemopen (void *buf, size_t size, const
我正在尝试插入最初从 stdin 读取的 fscanf 函数,例如 fscanf(stdin,"%ms", &secret)。在我的插入函数中,我试图让它从我用字符串创建的输入文件中读取。以下是我正在
可以肯定的是,缓冲 I/O 到磁盘上的文件比无缓冲更快。但为什么即使写入内存缓冲区也有好处? 以下基准代码示例是使用 gcc 5.40 使用优化选项 -O3 编译的,链接到 glibc 2.24。 (
已通过 glibc 2.24 解决 -- 请参阅下面的更新 这是一段 C 代码(使用 gcc 5.3.1、glibc 2.23 编译): #include #include #include #
我可以使用什么来编写自定义流? 最佳答案 fmemopen 是 POSIX 但不是 C 标准的一部分。 fopencookie 不是任何标准的一部分;这是一个 GNU 函数。 tmpfile 是 fm
我是一名优秀的程序员,十分优秀!