fprintf乱码问题!

z_lllllll 2017-12-03 06:21:40
#include<iostream>
using namespace std;
typedef struct w
{
int no;
char name[100];
int depno;
int salary;
struct w* next;
} worker;

void input(worker*&L)
{
worker*p;
p=(worker*)malloc(sizeof(worker));
cout<<"请按顺序分别输入职工编号,姓名,部门,工资(两信息间用空格分离)"<<endl;
cin>>p->no>>p->name>>p->depno>>p->salary;
p->next=L->next;
L->next=p;
}

void show(worker*L)
{
worker*p=L->next;
cout<<"工号 姓名 部门 工资"<<endl;
for(p=L->next;p!=NULL;p=p->next)
cout<<p->no<<" "<<p->name<<" "<<p->depno<<" "<<p->salary<<endl;
}

void num_sort(worker*&pno)
{
worker*p,*q,*s;
if(pno->next==NULL)
{
cout<<"链表为空"<<endl;
return;
}
q=pno->next->next;
pno->next->next=NULL;
while(q!=NULL)
{
p=pno;
while(p->next!=NULL && q->no >= p->next->no)
p=p->next;
s=q->next;
q->next=p->next;
p->next=q;
q=s;
}
cout<<"已排序完毕"<<endl;
}
void show_pno(worker*&pno)
{
worker*p=pno->next;
cout<<"工号 姓名 部门 工资"<<endl;
for(p=pno->next;p!=NULL;p=p->next)
cout<<p->no<<" "<<p->name<<" "<<p->depno<<" "<<p->salary<<endl;
}

void dep_sort(worker*&depno)
{
worker*p,*q,*s;
if(depno->next==NULL)
{
cout<<"链表为空"<<endl;
return;
}
q=depno->next->next;
depno->next->next=NULL;
while(q!=NULL)
{
p=depno;
while(p->next!=NULL && q->depno >= p->next->depno)
p=p->next;
s=q->next;
q->next=p->next;
p->next=q;
q=s;
}
cout<<"已排序完毕"<<endl;
}
void show_depno(worker*depno)
{
worker*p=depno->next;
cout<<"工号 姓名 部门 工资"<<endl;
for(p=depno->next;p!=NULL;p=p->next)
cout<<p->no<<" "<<p->name<<" "<<p->depno<<" "<<p->salary<<endl;
}
void sal_sort(worker*&psalary)
{
worker*p,*q,*s;
if(psalary->next==NULL)
{
cout<<"链表为空"<<endl;
return;
}
q=psalary->next->next;
psalary->next->next=NULL;
while(q!=NULL)
{
p=psalary;
while(p->next!=NULL && q->salary >= p->next->salary)
p=p->next;
s=q->next;
q->next=p->next;
p->next=q;
q=s;
}
cout<<"链表为空"<<endl;
}
void show_psalary(worker*psalary)
{
worker*p=psalary->next;
cout<<"工号 姓名 部门 工资"<<endl;
for(p=psalary->next;p!=NULL;p=p->next)
cout<<p->no<<" "<<p->name<<" "<<p->depno<<" "<<p->salary<<endl;
}
void save(worker*&L)
{
FILE *fp;
worker*p;p=L;
if((fp=fopen("C:\\11\\worker.txt","w"))==NULL)
cout<<"error"<<endl;
for(p;p!=NULL;p=p->next)
{
fprintf(fp,"%x,%x,%x,%x",p->no,p->name,p->depno,p->salary);
}
fclose(fp);
exit(0);
}



void destroy(worker*&L)
{
worker*p=L->next,*q;
while(p!=NULL)
{
q=p;
p=p->next;
free(q);
}
L->next=NULL;
cout<<"已删除全部职工记录"<<endl;
}
void menu()
{


cout<<" 菜单 "<<endl;
cout<<" 1:输入一个职工记录 "<<endl;
cout<<" 2:显示所有职工记录 "<<endl;
cout<<" 3:按工号升序排序 "<<endl;
cout<<" 4:按工号升序排序输出 "<<endl;
cout<<" 5:按部门升序排序 "<<endl;
cout<<" 6:按部门升序排序输出 "<<endl;
cout<<" 7:按工资升序排序 "<<endl;
cout<<" 8:按工资升序排序输出 "<<endl;
cout<<" 9:删除全部职工记录 "<<endl;
cout<<" 10:将单链表中的所有节点存储到职工文件中并退出 "<<endl;
}

void main()
{
int option,T=0;
menu();
worker*L=(worker*)malloc(sizeof(worker));
worker*pno=(worker*)malloc(sizeof(worker));
pno=L;
worker *depno=(worker*)malloc(sizeof(worker));
depno=L;
worker*psalary=(worker*)malloc(sizeof(worker));
psalary=L;
L->next=NULL;
for(;;)
{
cout<<"请输入选项序号: ";
cin>>option;
switch(option)
{
case 1:
input(L);
break;
case 2:
show(L);
break;
case 3:
num_sort(pno);
break;
case 4:
show_pno(pno);
case 5:
dep_sort(depno);
break;
case 6:
show_depno(depno);
break;
case 7:
sal_sort(psalary);
break;
case 8:
show_psalary(psalary);
break;
case 9:
destroy(L);
break;
case 10:
save(L);
break;
default:
cout<<"选项序号输入错误,请重新输入!"<<endl;
}
if(T)
break;
}
cout<<"程序运行结束!"<<endl;
}

save函数里面的fprintf,打开文本后是乱码
...全文
526 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-05
  • 打赏
  • 举报
回复
不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
被遗忘de角落 2017-12-04
  • 打赏
  • 举报
回复
fprintf(fp,"%d,%s,%d,%d",p->no,p->name,p->depno,p->salary);
destory27 2017-12-04
  • 打赏
  • 举报
回复
你输入到文件中, 一种是二进制文件,一种是文本文件 只有字符能看
自信男孩 2017-12-04
  • 打赏
  • 举报
回复
for(;p!=NULL;p=p->next)
    {
        fprintf(fp,"%x,%s,%x,%x",p->no, p->name,p->depno,p->salary);
    }
name是字符数组,应该是用%s输出。用%x输出自然会有问题;
[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,也解决不了。 这里面汇编指令也有很多问题。 今天太迟了,就不继续下去了。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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