【发布时间】:2017-04-14 23:44:35
【问题描述】:
我在将uint32_t 值写入文件并将其读回时遇到问题。
为了将其写入文件,我使用
uint32_t num = 2036465665 ;
FILE *fp = fopen("test.dat", "w");
fprintf(fp,"value = %" PRIu32 "\n", num);
fclose(fp);
为了读取它,我首先将文件的内容复制到数组data[] 中,然后逐行提取值。
int len = 100;
char *line = malloc(len * sizeof(char));
char field[256], tmp[2];
FILE *fp = fopen("test.dat", "r");
while ( -1 != getline(&line, &len, fp)){
char *value=malloc(sizeof(char)*256);
sscanf( line, "%s %s %s", field, tmp, value);
data[i] = value;
i++;
}
fclose(fp);
为了读取 uint32_t 变量的值,我得到了 atoi 和 strtoul 不同基数的不同值,但不是写入文件的确切值。
uint32_t read_num;
read_num = strtoul (data[0], NULL, 32);
这给出了 read_num 的值为 1345324165。
read_num = (uint32_t) atoi(data[0]);
提供 3226523632
如何获得保存在文件中的正确值。 (i) 使用 sscanf 将文件内容读取到字符串中或 (ii) strtoul 与 atoi (iii) strtoul() 中的基数是否存在错误。
【问题讨论】:
-
strtoul (data[0], NULL, 32); -- 你的值是 32 进制的吗?我会查找如何正确使用此功能;根据我看过的应该是 10,而不是 32。
-
@MateoConLechuga:实际上,
getline()在 POSIX 中定义为返回-1而不是EOF,所以使用-1是正确的。 -
@kris:你打印出你读过的字符串了吗?
data数组的定义是什么?你检查sscanf()的返回值了吗? -
你的 test.dat 文件是 ascii 吗?如果可能,请发布它的样本。
-
我的编译器抱怨
int len;与getline()期望的size_t *不匹配。这是你的问题的一个因素吗?修复后(我告诉编译器将警告视为错误),我让您的代码为我工作(macOS Sierra 10.12.4,GCC 6.3.0 — 64 位编译)。