字体文件解析 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语言的文件中读取某些字符串?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Anaconda下载tensorflo
- 下一篇: Anaconda下载及安装(图文)