在执行文件I/O时,我应该像对待int一样对待bool变量吗?我的意思是使用下面的代码片段是正确的吗?
int
bool
bool b = true; FILE *fp1, *fp2; ... fprintf(fp1, "%d", b); fscanf(fp2, "%d", &b);
字符串我想知道基于ISO C规范的答案。
n3h0vuf21#
在进行文件I/O时,我应该像对待int一样对待bool变量吗?不,不是输入。是的,可以用于输出,因为bool转换为int作为...参数的一部分,并且int匹配"%d"。我的意思是用...不一定。它可能会工作。这是 * 未定义行为 *(UB)。我想知道基于ISO C规范的答案。没有C指定的方式通过fscanf()和朋友读取bool。
...
"%d"
fscanf()
scanf()
char
"0"
"1"
"true"
"false"
bool b = true; FILE *fp1, *fp2; ... fprintf(fp1, "%d", b); int tmp; fscanf(fp2, "%d", &tmp); b = tmp;
字符串
char tmp[2]; fscanf(fp2, "%1[0-1]", tmp); b = tmp[0] == '1';
型
"t"
"FalsE"
Rough idea. (Not really that great, just for illustration.) // Read `bool` from `stdin`. Return 1 (success), EOF(end-of-file) and 0 in other cases. int scan_bool(bool *b) { char buf[2]; int cnt = scanf("%1[01tfTF]", buf); if (cnt != 1) { return cnt; } *b = buf[0] == '1' || buf[0] == 't' || buf[0] == 'T'; return 1; }
dsekswqp2#
OP并不是在寻求一个替代方案,但下面的未经测试的 *1代码可以提供一些想法。它试图遵循fscanf()的精神,并接受“0”,“1”和无大小写的“t”,“f”,“true”,“false”。
#include <ctype.h> #include <stdbool.h> #include <stdio.h> /* * Read a 'bool'. * * Read stream until: * * ignore leading white-space. * * a complete case-less match to: "0", "1", "f", "t", "false", "true", * * end-of-file, or input error. * Non-matching characters are pushed back. * * On success, assign *b as true or false (1 or 0). * * Return 1 on success, * EOF on input error or immediate end-of-file. * 0 otherwise. */ int fscan_bool(FILE *inf, bool *b) { int first_ch; do { first_ch = fgetc(inf); } while (isspace(first_ch)); if (first_ch == '0' || first_ch == '1') { *b = (first_ch == '1'); return 1; } if (first_ch == EOF) { return EOF; } int buf[5]; buf[0] = first_ch; first_ch = tolower(first_ch); if (first_ch != 'f' && first_ch != 't') { ungetc(buf[0], inf); return 0; } bool value = (first_ch == 't'); static const char *ft[2] = {"false", "true"}; const char *match = ft[value]; for (unsigned i = 1; match[i]; i++) { buf[i] = fgetc(inf); int next_ch = tolower(buf[i]); if ((next_ch == EOF) && !feof(inf)) { // Input error return EOF; } if (next_ch != match[i]) { do { // Attempt to unget all "next" characters. // The first attempt should work if not EOF. // Subsequent ones may work, may fail. ungetc(buf[i--], inf); } while (i > 0); break; } } *b = value; return 1; }
类似代码和测试线束here的代码评审请求。
2条答案
按热度按时间n3h0vuf21#
在进行文件I/O时,我应该像对待int一样对待bool变量吗?
不,不是输入。
是的,可以用于输出,因为
bool
转换为int
作为...
参数的一部分,并且int
匹配"%d"
。我的意思是用...
不一定。它可能会工作。这是 * 未定义行为 *(UB)。
我想知道基于ISO C规范的答案。
没有C指定的方式通过
fscanf()
和朋友读取bool
。bool
缺少scanf()
输入说明符。bool
的大小可能与int
不同。它可能与char
或其他相同。"0"
,"1"
使用和"true"
,"false"
不需要,读入一个int
并转换。字符串
型
"t"
,"FalsE"
,.scanf()
的返回值。型
dsekswqp2#
OP并不是在寻求一个替代方案,但下面的未经测试的 *1代码可以提供一些想法。它试图遵循
fscanf()
的精神,并接受“0”,“1”和无大小写的“t”,“f”,“true”,“false”。字符串
类似代码和测试线束here的代码评审请求。