日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字体文件解析 c语言,如何正确地从C语言的文件中读取某些字符串?

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字体文件解析 c语言,如何正确地从C语言的文件中读取某些字符串? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

您試圖從文件中讀取的內容并不簡單,但可以通過設置一個標志來處理,該標志告訴您是否已經看到

'a'

'b'

,跳過所有空白和

':'

字符,將所有其他字符存儲在緩沖區中,根據需要重新分配,然后在第二個

“A”

“B”

找到了,把那個角色放回

FILE*

流與

ungetc

,nul終止并返回緩沖區。

聽起來很簡單——對吧?好吧,差不多了。讓我們看看你需要什么

readword()

功能。

首先,因為你分配給

buffer

在里面

Read Word()

,不需要通過

char **buffer

作為參數。你已經聲明了

readword

作為

char *readword(...)

所以只要通過

文件*

將指針作為參數,并返回指向

NUL終止

緩沖器。

您可以按自己喜歡的任何方式處理重新分配方案,可以從分配的合理字符數開始,然后將當前大小加倍(或添加一些倍數),或者每次用完時添加一個固定的數量。下面的示例只是從一個32個字符的緩沖區開始,然后在每次需要重新分配時再添加32個字符。(如果數據大小真的未知,我可能會從32個字符開始,然后每次用完都加倍——完全取決于您)。

使用

isspace()

函數位于

ctype.h

確保正確處理所有空白。

最后幾個問題只是確保您返回

NUL終止

緩沖區中的字符串,并確保在以下情況下重新初始化指向每個新內存塊中緩沖區結尾的指針

realloc

被稱為。

總而言之,你可以做一些類似的事情。在

Read Word()

函數讀取示例文件并輸出從文件中讀取的組合字符串,

#include

#include

#include

#define NCHR 32

char *readword (FILE *fp)

{

int c, /* current character */

firstline = 0; /* flag for 'a' or 'b' found at 1st char */

size_t n = 0, nchr = NCHR; /* chars read, number of chars allocated */

char *buffer = NULL, *p; /* buffer to fill, pointer to buffer */

buffer = malloc (nchr); /* allocate initial NCHR */

if (!buffer) { /* validate */

perror ("malloc-buffer");

return NULL;

}

p = buffer; /* set pointer to buffer */

while ((c = fgetc (fp)) != EOF) { /* read each char */

if (isspace (c) || c == ':') /* skip all whitespace and ':' */

continue;

if (c == 'a' || c == 'b') { /* begins with 'a' or 'b' */

if (firstline) { /* already had a/b line */

ungetc (c, fp); /* put the char back */

*p = 0; /* nul-terminate */

return buffer; /* return filled buffer */

}

firstline = 1; /* set firstline flag */

continue;

}

else {

if (n == nchr - 2) { /* check if realloc needed */

void *tmp = realloc (buffer, nchr + NCHR);

if (!tmp) /* validate */

exit (EXIT_FAILURE);

buffer = tmp; /* assign new block to buffer */

p = buffer + n; /* set p at buffer end */

nchr += NCHR; /* update no. chars allocated */

}

*p++ = c; /* assign the current char and advance p */

n++; /* increment your character count */

}

}

*p = 0; /* nul-terminate */

return buffer;

}

int main (int argc, char **argv) {

char buf[NCHR], *word;

int nwords, toggle = 0;

/* use filename provided as 1st argument (stdin by default) */

FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

if (!fp) { /* validate file open for reading */

perror ("file open failed");

return 1;

}

if (!fgets (buf, NCHR, fp)) {

fputs ("error: read of line 1 failed.\n", stderr);

return 1;

}

if (sscanf (buf, "%d", &nwords) != 1) {

fputs ("error: invalid file format.\n", stderr);

return 1;

}

nwords *= 2; /* actual number of words is twice the number of pairs */

while (nwords-- && (word = readword (fp))) {

printf ("%c: %s\n", toggle ? 'b' : 'a', word);

free (word);

if (toggle) {

putchar ('\n');

toggle = 0;

}

else

toggle = 1;

}

if (fp != stdin) fclose (fp); /* close file if not stdin */

return 0;

}

(

音符:

在上面

toggle

僅僅是一個

1

0

用于輸出的標志

"a:"

"b:"

在適當行的開頭添加

'\n'

兩行之間。)

示例使用/輸出

$ ./bin/read_multiline_pairs dat/pairsbinline.txt

a: 010101000001010111110100101010000000111100000000000011110000

b: 0000011111000001000110101010100111110001

a: 0000001111111111110000111111111111000

b: 00000001111001010101

內存使用/錯誤檢查

在動態分配存儲空間時,請始終驗證內存使用情況,并確保已釋放所有分配的內存。

$ valgrind ./bin/read_multiline_pairs dat/pairsbinline.txt

==14257== Memcheck, a memory error detector

==14257== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.

==14257== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info

==14257== Command: ./bin/read_multiline_pairs dat/pairsbinline.txt

==14257==

a: 010101000001010111110100101010000000111100000000000011110000

b: 0000011111000001000110101010100111110001

a: 0000001111111111110000111111111111000

b: 00000001111001010101

==14257==

==14257== HEAP SUMMARY:

==14257== in use at exit: 0 bytes in 0 blocks

==14257== total heap usage: 8 allocs, 8 frees, 872 bytes allocated

==14257==

==14257== All heap blocks were freed -- no leaks are possible

==14257==

==14257== For counts of detected and suppressed errors, rerun with: -v

==14257== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

仔細看一下,如果有問題請告訴我。問題的最大部分是處理每對的所有行的讀取和連接。剩下的代碼就留給你了。

總結

以上是生活随笔為你收集整理的字体文件解析 c语言,如何正确地从C语言的文件中读取某些字符串?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。