以下代码行将unsigned int值写入文件,但文件内容不可读。
struct rabin_polynomial
{
uint64_t start;
uint16_t length;
struct rabin_polynomial *next_polynomial;
};
fprintf(out_file, "%llu,%u",poly->start,poly->length);
如果我将代码的输出显示在命令行屏幕上,则它是可读的。
文件“out_file”未以二进制模式打开。
这是输出文件的部分内容:
-ÍÍÍÍÍÍp\y";^æó r\ ÍÍÍÍ- ÍÍÍÍÍÍ
Ø∿»Iðr\ ÍÍÍÍ- wÍÍÍÍÍÍ7OT-OØÚ‚\ ÍÍÍͤ* L ÍÍÍÍÍÍî›ùçÉç`‚\ ÍÍÍÍð3 ÍÍÍÍÍÍ
Ø∿»I°‚\ ÍÍÍÍðC ÍÍÍÍÍÍíK¬è‹Ç{ ƒ\ ÍÍÍÍðS • ÍÍÍÍÍÍ-Ló3lJ–ÞPƒ\ ÍÍÍÍ…]
这是预期的输出:
0,2861
2861,4096
6957,3959
10916,2380
13296,4096
17392,4096
答案 0 :(得分:5)
如果你没有得到你期望的文本值,那么可能归结为你使用了错误的格式说明符(我假设你已经填充您尝试在此处打印的变量,但您可能需要确认这一点。
%llu
明确用于unsigned long long int
,其宽度不一定与uint64_t
相同。
在C99中,inttypes.h
具有用于格式说明符的宏,用于精确宽度和-at-least-wide-wide-as数据类型。
例如:
uint64_t xyzzy = 42;
printf ("Number is: %" PRIu64 "\n", xyzzy);
在这种情况下,对于64位精确宽度变量,PRIu64
表示printf
格式说明符,无符号十进制输出。对于不同的输出类型,还有很多其他类型,以及scanf
系列的等价物(从SCN
开始)。
C99的7.8.1 Macros for format specifiers
部分详细列出了它们。
根据您的更新,您没有得到错误的数字,而是得到的东西只能被描述为垃圾,我会说您的问题在于其他地方。即使有损坏的指针或数据,我也不希望fprintf
为数字格式字符串生成非数字数据。它肯定是可能的,因为它是未定义的行为,但非常不可能。
你可以获得字符串的那种输出,但这不是这种情况。
换句话说,我认为你必须在代码的其他地方寻找(例如)内存损坏问题。
你可以做的一件事就是测试问题是否在你认为的行中,将其改为:
printf("DEBUG: %llu,%u\n",poly->start,poly->length);
fprintf(out_file, "%llu,%u",poly->start,poly->length);
看看终端上发生了什么。
答案 1 :(得分:1)
您可能需要分享您的代码的读写部分,以便我们为您提供帮助。但是查看写入out文件的内容,看起来像fprintf()
和fscanf()
中的格式说明符一样。
以下程序可能会为您提供参考。
#include <stdio.h>
#include <stdlib.h>
#define LEN 6
int main(void)
{
unsigned long long start[LEN] = {0, 2861, 6957, 10916, 13296, 17392};
unsigned short int length[LEN] = {2861, 4096, 3959, 2380, 4096, 4096};
int i;
unsigned long long s;
unsigned short int l;
FILE *out_file, *in_file;
if ((out_file = fopen("out_file", "w")) == NULL) {
printf("ERROR: unable to open out_file\n");
return -1;
}
for (i=0; i<LEN; i++)
fprintf(out_file, "%llu,%hu \n",start[i], length[i]);
fclose(out_file);
if ((in_file = fopen("out_file", "r")) == NULL) {
printf("ERROR: unable to open out_file\n");
return -1;
}
for (i=0; i<LEN; i++) {
fscanf(out_file, "%llu,%hu \n", &s, &l);
printf("start = %llu - length = %hu \n", s, l);
}
fclose(in_file);
return 0;
}
请注意,format
和fscanf()
中的fprintf()
(第二个参数)必须分别与reading
和writing
行匹配。
答案 2 :(得分:0)
请使用十六进制编辑器检查文件内容,并与多边形结构的实际值进行比较。
你会看到什么是问题。