关于fprintf()使用出现乱码

tianxuan1123 2012-10-18 09:46:51
我最近需转换一个文件中数据的格式,附上这种数据的格式如下:
128166481075232275,rsrch,1,Write,281358336,45056,94872
128166481075232718,rsrch,1,Write,281292800,65536,94430
128166481075299367,rsrch,1,Write,281227264,65536,27781
128166481075308919,rsrch,1,Write,281161728,65536,18228
128166624705595699,rsrch,1,Read,279339008,4096,122805
我自己的程序主要部分如下所示:
while((ch=fgetc(fp1))!=EOF)
{
fseek(fp1,-1,1L);
if(fgets(line,200,fp1)==NULL)
{
return (0);
}
if(sscanf(line, "%llu,%*[^,],%d,%[^,],%llu,%d,%*d\n", &startTime,&devno,flag,&blkno,&bcount))
itemcount++;
else
{
fprintf(stderr, "Wrong number of arguments for I/O trace event type\n");
fprintf(stderr, "line: %s", line);
break;
}
if(strcmp(flag,"Read")==0)
newflag=1;
else if(strcmp(flag,"Write")==0)
newflag=0;
else
printf("Unkown type of operation!\n");
fprintf(fp2,"%f %d %llu %d %x\n", startTime/10000000.0, 0, blkno/512, bcount/512, newflag);
其中的问题在于,最后一行,用fprintf向fp2指向的文件中写入格式化的数据,最后一项,用%x则可以正常写入,得到正确的文本,%d则得到乱码。newflag在程序开头处定义为int型变量。望大侠指点!
...全文
1591 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxuan1123 2012-11-22
  • 打赏
  • 举报
回复
多谢两位(@zhao4zhong1,@s_include)指点,问题已经解决了。
赵4老师 2012-10-19
  • 打赏
  • 举报
回复
To set a breakpoint when variable newflag changes value

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the variable newflag.
Click OK to set the breakpoint.
manxiSafe 2012-10-19
  • 打赏
  • 举报
回复

//数据 128166481075232275,rsrch,1,Write,281358336,45056,94872


sscanf(line, "%llu,%*[^,],%d,%[^,],%llu,%d,%*d\n", &startTime,&devno,flag,&blkno,&bcount)


仔细 再看看 你的 正则表达式,看是不是 粗心 写错了!
[TakeLionOS汇编与C语言自学笔记-第六课] 版权所有 2021年 江志剑 按照《21天学通C语言》(第七版),有如下一个例子P17。 将整个程序的代码,包括行号显示出来: //1、files:hellolistit.c hellolistitno.s hellolistit.exe /* hellolistit.c - 该程序将显示整个程序的代码,包括行号! */ #include #include #define BUFF_SIZE 256 void display_usage(void); int line; int main(int argc, char *argv[]) { char buffer[BUFF_SIZE]; FILE *fp; if (argc < 2) { display_usage(); } if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "Error opening file, %s!", argv[1]); return (1); } line = (1); while (fgets(buffer, BUFF_SIZE, fp) != NULL) fprintf(stdout,"%4d:\t%s", line++, buffer); fclose(fp); return 0; } void display_usage(void) { fprintf(stderr, "\nProper Usage is:"); fprintf(stderr, "\n\nhellolistit filename.ext\n"); } 我是用GCC 8.1.0在命令行窗口运行的。 GCC编译时候,其实有四个步骤: 1、预处理:gcc -E hello.c -o hello.i 2、编译生成汇编语言:gcc -S hello.i -o hello.s 3、汇编:gcc -c hello.s -o hello.o 4、链接生成可执行文件:gcc hello.o -o hello 这时候,我想看一下第二步生成的汇编语言代码。 因为本身就是研究操作系统的一部分,所以要研究底层的汇编语言。 结果发现是AT&T格式的汇编语言风格,而且大量使用汇编宏。 所以启用了GCC的编译选项-fno-asynchronous-unwind-tables,直接预处理为没有cfi宏的汇编指令。 这里就是包含*no.s形式的文件。 最后的LEAVE指令,等效于“MOV ESP,EBP”和“POP EBP”两条指令。 这个指令调整了数据栈指针ESP,并将EBP的数值恢复到调用这个函数之前的初始状态。 毕竟函数要在退出之前恢复这些寄存器的值。 问题是其中的注释中文字符,输出的时候会出现乱码?这个问题暂时解决不了。 用了-fexec-charset=gbk 和-finput-charset=gbk,也解决不了。 这里面汇编指令也有很多问题。 今天太迟了,就不继续下去了。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧