C语言。将信息输入到文件中,打开文件发现是乱码,但是可以正常输出

wulawulawa_ 2018-01-01 09:36:39

这是输入部分的代码

这是运行以后打开的文件内容
但是输出信息的时候是正确的,为什么?
...全文
2039 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
_异想天开_ 2018-01-10
  • 打赏
  • 举报
回复
二进制和ascii码是不同的
wulawulawa_ 2018-01-10
  • 打赏
  • 举报
回复
引用 14 楼 thecentry 的回复:
你似乎可以把你得结构体也贴出来,或者说整个程序,这样别人还能帮你调试一番
#include <stdio.h> 
#include<stdlib.h>
#pragma warning(disable:4996)
struct emploee {
	int count;
	char name[20];
	char sex;
	int age;
	int income;
};
void input();
void output();
void add(struct emploee emp);
void delet(int num);
void search(int num);
int main()
{
	struct emploee emp;
	int num;
	input();
	output();
	printf("******************************************\n");
	printf("请输入操作对应的数字:\n");
	printf("1--查找员工信息\n");
	printf("2--删除员工信息\n");
	printf("3--插入员工信息\n");
	printf("4--退出\n");
	printf("******************************************\n");
	char c;
	while ((c = getchar()) != '4') {
		switch (c) {
		case'1':
			printf("请输入要查找的员工编号:");
			scanf("%d", &num);
			search(num);
			break;
		case'2':
			printf("请输入要删除的员工编号:");
			scanf("%d", &num);
			delet(num);
			break;
		case'3':
			printf("请输入要插入的员工信息:");
			scanf("%d%s", &emp.count, emp.name);
			getchar();
			scanf("%c%d%d", &emp.sex, &emp.age, &emp.income);
			add(emp);
			break;
		}
	}
}
void input() {
	FILE* a;
	struct emploee emp;
	if ((a = fopen("emploee.txt", "w")) == NULL) {
		printf("con't open");
		exit(0);
	}
	else {
		int i = 0;
		printf("请输入员工信息:编号,姓名,性别,年龄,工资(编号输入0时结束)\n");
		scanf("%d", &emp.count);
		while (emp.count != 0) {
			i++;
			scanf("%s", emp.name);
			getchar();
			scanf("%c%d%d", &emp.sex, &emp.age, &emp.income);
			fwrite(&emp, sizeof(struct emploee), 1, a);
			scanf("%d", &emp.count);
		}
		fclose(a);
	}
}
void output() {
	FILE* a;
	struct emploee emp;
	if ((a = fopen("emploee.txt", "r")) == NULL) {
		printf("con't open");
		exit(0);
	}
	else {
		printf("现有员工信息为:\n");
		while (fread(&emp, sizeof(struct emploee), 1, a)) {
			printf("%d %s %c %d %d\n", emp.count, emp.name, emp.sex, emp.age, emp.income);
		}
		fclose(a);
	}
}
void add(struct emploee emp) {
	FILE* a;
	if ((a = fopen("emploee.txt", "a")) == NULL) {
		printf("con't open");
		exit(0);
	}
	else {
		fwrite(&emp, sizeof(struct emploee), 1, a);
		fclose(a);
		output();
	}
}
void delet(int num) {
	FILE* a, *a2;
	struct emploee emp;
	if ((a = fopen("emploee.txt", "r+")) == NULL) {
		printf("con't open");
		exit(0);
	}
	if ((a2 = fopen("emploee_f.txt", "w")) == NULL) {
		printf("con't open");
		exit(0);
	}
	while (fread(&emp, sizeof(struct emploee), 1, a)) {
		if (emp.count != num) {
			fwrite(&emp, sizeof(struct emploee), 1, a2);
		}
	}
	fclose(a); fclose(a2);
	if ((a2 = fopen("emploee_f.txt", "r+")) == NULL) {
		printf("con't open");
		exit(0);
	}
	if ((a = fopen("emploee.txt", "w")) == NULL) {
		printf("con't open");
		exit(0);
	}
	while (fread(&emp, sizeof(struct emploee), 1, a2)) {
		fwrite(&emp, sizeof(struct emploee), 1, a);
	}
	fclose(a); fclose(a2);
	printf("已删除");
	output();
}
void search(int num) {
	FILE* a;
	struct emploee emp;
	if ((a = fopen("emploee.txt", "r")) == NULL) {
		printf("con't open");
		exit(0);
	}
	else {
		int flag = 0;
		while (!feof(a)) {
			fread(&emp, sizeof(struct emploee), 1, a);
			if (emp.count == num) {
				flag = 1;
				printf("此员工信息为:");
				printf("%d %s %c %d %d\n", emp.count, emp.name, emp.sex, emp.age, emp.income);
				break;
			}
		}
		if (flag == 0) {
			printf("not find");
		}
		fclose(a);
	}
开源学开源 2018-01-10
  • 打赏
  • 举报
回复
引用 15 楼 x591801194 的回复:
[quote=引用 14 楼 thecentry 的回复:] 你似乎可以把你得结构体也贴出来,或者说整个程序,这样别人还能帮你调试一番
#include <stdio.h> 
#include<stdlib.h>
#pragma warning(disable:4996)
struct emploee {
	int count;
	char name[20];
	char sex;
	int age;
	int income;
};
void input();
void output();
void add(struct emploee emp);
void delet(int num);
void search(int num);
int main()
{
	struct emploee emp;
	int num;
	input();
	output();
	printf("******************************************\n");
	printf("请输入操作对应的数字:\n");
	printf("1--查找员工信息\n");
	printf("2--删除员工信息\n");
	printf("3--插入员工信息\n");
	printf("4--退出\n");
	printf("******************************************\n");
	char c;
	while ((c = getchar()) != '4') {
		switch (c) {
		case'1':
			printf("请输入要查找的员工编号:");
			scanf("%d", &num);
			search(num);
			break;
		case'2':
			printf("请输入要删除的员工编号:");
			scanf("%d", &num);
			delet(num);
			break;
		case'3':
			printf("请输入要插入的员工信息:");
			scanf("%d%s", &emp.count, emp.name);
			getchar();
			scanf("%c%d%d", &emp.sex, &emp.age, &emp.income);
			add(emp);
			break;
		}
	}
}
void input() {
	FILE* a;
	struct emploee emp;
	if ((a = fopen("emploee.txt", "w")) == NULL) {
		printf("con't open");
		exit(0);
	}
	else {
		int i = 0;
		printf("请输入员工信息:编号,姓名,性别,年龄,工资(编号输入0时结束)\n");
		scanf("%d", &emp.count);
		while (emp.count != 0) {
			i++;
			scanf("%s", emp.name);
			getchar();
			scanf("%c%d%d", &emp.sex, &emp.age, &emp.income);
			fwrite(&emp, sizeof(struct emploee), 1, a);
			scanf("%d", &emp.count);
		}
		fclose(a);
	}
}
void output() {
	FILE* a;
	struct emploee emp;
	if ((a = fopen("emploee.txt", "r")) == NULL) {
		printf("con't open");
		exit(0);
	}
	else {
		printf("现有员工信息为:\n");
		while (fread(&emp, sizeof(struct emploee), 1, a)) {
			printf("%d %s %c %d %d\n", emp.count, emp.name, emp.sex, emp.age, emp.income);
		}
		fclose(a);
	}
}
void add(struct emploee emp) {
	FILE* a;
	if ((a = fopen("emploee.txt", "a")) == NULL) {
		printf("con't open");
		exit(0);
	}
	else {
		fwrite(&emp, sizeof(struct emploee), 1, a);
		fclose(a);
		output();
	}
}
void delet(int num) {
	FILE* a, *a2;
	struct emploee emp;
	if ((a = fopen("emploee.txt", "r+")) == NULL) {
		printf("con't open");
		exit(0);
	}
	if ((a2 = fopen("emploee_f.txt", "w")) == NULL) {
		printf("con't open");
		exit(0);
	}
	while (fread(&emp, sizeof(struct emploee), 1, a)) {
		if (emp.count != num) {
			fwrite(&emp, sizeof(struct emploee), 1, a2);
		}
	}
	fclose(a); fclose(a2);
	if ((a2 = fopen("emploee_f.txt", "r+")) == NULL) {
		printf("con't open");
		exit(0);
	}
	if ((a = fopen("emploee.txt", "w")) == NULL) {
		printf("con't open");
		exit(0);
	}
	while (fread(&emp, sizeof(struct emploee), 1, a2)) {
		fwrite(&emp, sizeof(struct emploee), 1, a);
	}
	fclose(a); fclose(a2);
	printf("已删除");
	output();
}
void search(int num) {
	FILE* a;
	struct emploee emp;
	if ((a = fopen("emploee.txt", "r")) == NULL) {
		printf("con't open");
		exit(0);
	}
	else {
		int flag = 0;
		while (!feof(a)) {
			fread(&emp, sizeof(struct emploee), 1, a);
			if (emp.count == num) {
				flag = 1;
				printf("此员工信息为:");
				printf("%d %s %c %d %d\n", emp.count, emp.name, emp.sex, emp.age, emp.income);
				break;
			}
		}
		if (flag == 0) {
			printf("not find");
		}
		fclose(a);
	}
[/quote]
#include <stdio.h> 
#include<stdlib.h>
#pragma warning(disable:4996)
struct emploee
{
	
	char count[5];		
	char name[20];
	char sex;
	char age[3];
	char income[5];
};
void input();
void output();
void add(struct emploee emp);
void delet(int num);
void search(int num);
int main()
{
//	struct emploee emp;
//	int num;
	input();
//	output();
	printf("******************************************\n");
	printf("请输入操作对应的数字:\n");
	printf("1--查找员工信息\n");
	printf("2--删除员工信息\n");
	printf("3--插入员工信息\n");
	printf("4--退出\n");
	printf("******************************************\n");
	/*char c;
	while ((c = getchar()) != '4')
	{
		switch (c)
		{
		case'1':
			printf("请输入要查找的员工编号:");
			scanf("%d", &num);
			search(num);
			break;
		case'2':
			printf("请输入要删除的员工编号:");
			scanf("%d", &num);
			delet(num);
			break;
		case'3':
			printf("请输入要插入的员工信息:");
			scanf("%d%s", &emp.count, emp.name);
			getchar();
			scanf("%c%d%d", &emp.sex, &emp.age, &emp.income);
			add(emp);
			break;
		}
	}*/
}
void input()
{
	FILE* a;
	struct emploee emp;
	if ((a = fopen("emploee.txt", "w")) == NULL)
	{
		printf("con't open");
		exit(0);
	}
	else
	{
		int i = 0;
		printf("请输入员工信息:编号,姓名,性别,年龄,工资(编号输入0时结束)\n");
		while (true)
		{
			int count;
			int age;
			int income;
			i++;
			memset(&emp, 0, sizeof(emp));
			scanf("%d", &count);
			scanf("%s", emp.name);
			getchar();
			scanf("%c%d%d", &emp.sex, &age, &income);
			itoa(count, emp.count, 10);
			itoa(age, emp.age, 10);
			itoa(income, emp.income, 10);
	//		fwrite(countt, 5, 1, a);
			
			fwrite(&emp, sizeof(emp), 1, a);
			scanf("%d", &count);
			if (count == 0)
				break;
		}
		fclose(a);
	}
}
//void output()
//{
//	FILE* a;
//	struct emploee emp;
//	if ((a = fopen("emploee.txt", "r")) == NULL)
//	{
//		printf("con't open");
//		exit(0);
//	}
//	else
//	{
//		printf("现有员工信息为:\n");
//		while (fread(&emp, sizeof(struct emploee), 1, a))
//		{
//			printf("%s %s %c %s %s\n", emp.count, emp.name, emp.sex, emp.age, emp.income);
//		}
//		fclose(a);
//	}
//}
//void add(struct emploee emp)
//{
//	FILE* a;
//	if ((a = fopen("emploee.txt", "a")) == NULL)
//	{
//		printf("con't open");
//		exit(0);
//	}
//	else
//	{
//		fwrite(&emp, sizeof(struct emploee), 1, a);
//		fclose(a);
//		output();
//	}
//}
//void delet(int num)
//{
//	FILE* a, *a2;
//	struct emploee emp;
//	if ((a = fopen("emploee.txt", "r+")) == NULL)
//	{
//		printf("con't open");
//		exit(0);
//	}
//	if ((a2 = fopen("emploee_f.txt", "w")) == NULL)
//	{
//		printf("con't open");
//		exit(0);
//	}
//	while (fread(&emp, sizeof(struct emploee), 1, a))
//	{
//		if (emp.count != num)
//		{
//			fwrite(&emp, sizeof(struct emploee), 1, a2);
//		}
//	}
//	fclose(a); fclose(a2);
//	if ((a2 = fopen("emploee_f.txt", "r+")) == NULL)
//	{
//		printf("con't open");
//		exit(0);
//	}
//	if ((a = fopen("emploee.txt", "w")) == NULL)
//	{
//		printf("con't open");
//		exit(0);
//	}
//	while (fread(&emp, sizeof(struct emploee), 1, a2))
//	{
//		fwrite(&emp, sizeof(struct emploee), 1, a);
//	}
//	fclose(a); fclose(a2);
//	printf("已删除");
//	output();
//}
//void search(int num)
//{
//	FILE* a;
//	struct emploee emp;
//	if ((a = fopen("emploee.txt", "r")) == NULL)
//	{
//		printf("con't open");
//		exit(0);
//	}
//	else
//	{
//		int flag = 0;
//		while (!feof(a))
//		{
//			fread(&emp, sizeof(struct emploee), 1, a);
//			if (emp.count == num)
//			{
//				flag = 1;
//				printf("此员工信息为:");
//				printf("%d %s %c %d %d\n", emp.count, emp.name, emp.sex, emp.age, emp.income);
//				break;
//			}
//		}
//		if (flag == 0)
//		{
//			printf("not find");
//		}
//		fclose(a);
//	}
//}
改了你的结构体,帮你实现了输入(文件保存的内容也是正确的),如有你觉得有参考价值可以继续下面的操作。你的这种写操作我以前看过一段通信传输代码也是这么搞的,我当时就表示怀疑这种操作是否正确。
开源学开源 2018-01-09
  • 打赏
  • 举报
回复
你似乎可以把你得结构体也贴出来,或者说整个程序,这样别人还能帮你调试一番
缘来是梦 2018-01-09
  • 打赏
  • 举报
回复
你写文件的时候写的是整个结构体的内容. 输出到屏幕的时候是按字符串输出的. 而你的输入数据并没有填充满整个结构. 文件中那个些????就是结构体里, 没有填充数据的内存里存的值被直接写到文件里了. 但是在输出到屏的时候,按字符串输出, 遇到结尾字符'\0'就不再往后输出了.
HomerRo 2018-01-07
  • 打赏
  • 举报
回复
估计是保存的是二进制代码,却用文本读取方式读取,就成乱码了,假如使用VC6.0就可以正常读取保存的二进制信息,我在一个C/C++课程中听到过。
qq_21767819 2018-01-06
  • 打赏
  • 举报
回复
引用 4 楼 x591801194的回复:
引用 1 楼 pearling 的回复:
文件编码方式问题,请参考https://zhidao.baidu.com/question/267841672.html
但是我以前在写入其他的文档是正确的啊
别人也有说的,fwrite他们是二进制存放进去的,这是最主要的原因
qq_21767819 2018-01-06
  • 打赏
  • 举报
回复
引用 4 楼 x591801194的回复:
引用 1 楼 pearling 的回复:
文件编码方式问题,请参考https://zhidao.baidu.com/question/267841672.html
但是我以前在写入其他的文档是正确的啊
因为他是以一个结构体的形式存档进去的,txt应该识别不了结构体的内容吧,但是他能识别字符串哇,你用fgest输入一段话存放进去,是能输出的
龙哥依旧 2018-01-05
  • 打赏
  • 举报
回复
memset(&emp, 0, sizeof(emploee));
醉轩亭 2018-01-04
  • 打赏
  • 举报
回复
文本文件的读写: 1、写字符函数: int fputc(char ch,FILE *fp) 形式:ch=fputc(ch,fp); 2、读字符函数: int fgetc(FILE *fp) 形式; ch =fgetc(ch,fp); 3、写字符串函数: int puts(char *string,FILE *fp) 形式:ch=fputs(str,fp); 4、读字符串函数: int gets(char *string,int n,FILE *fp) 形式:fgets(str,n,fp); 二进制文件的读写: 1、fwrite( ) 形式: fwrite(buffer,size,count,fp); 2、fread( ) 形式: fread(buffer,size,count,fp); 要分辨清楚普通文本文件(.txt) 和 二进制文件(.dat) 楼主将二进制文件与文本文件混用了,因此出现了乱码问题。
Kali_128 2018-01-03
  • 打赏
  • 举报
回复
你以二进制写入 看到的肯定是乱码啊
自信男孩 2018-01-03
  • 打赏
  • 举报
回复
fwrite/fread是二进制形式的写和读; 看到有些是乱码是因为它不是按照格式化(fscanf/fprintf)的读写。而是分块的读写。
赵4老师 2018-01-03
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
wulawulawa_ 2018-01-02
  • 打赏
  • 举报
回复
引用 2 楼 qq_21767819 的回复:
这应该没错吧,但是他存进去的格式应该不是txt,如果你尝试用fread读到标准窗口输出,应该是能准确输出的,你试试哈
所以fwrite不能写入txt文件吗?因为书上写的是date文件,我想看看输入的内容就改成txt格式了,不知道是不是这个问题?
wulawulawa_ 2018-01-02
  • 打赏
  • 举报
回复
引用 1 楼 pearling 的回复:
文件编码方式问题,请参考https://zhidao.baidu.com/question/267841672.html
但是我以前在写入其他的文档是正确的啊
qq_21767819 2018-01-02
  • 打赏
  • 举报
回复
这应该没错吧,但是他存进去的格式应该不是txt,如果你尝试用fread读到标准窗口输出,应该是能准确输出的,你试试哈
pearling 2018-01-02
  • 打赏
  • 举报
回复
文件编码方式问题,请参考https://zhidao.baidu.com/question/267841672.html

33,311

社区成员

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

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