fgets函数可以输入中文吗(c语言中文字如何存储)

本文目录
c语言中文字如何存储
可以用文件操作函数写入文件内储存。
1、C语言标准库提供了一系列文件操作函数。文件操作函数一般以f+单词的形式来命名(f是file的简写),其声明位于stdio.h头文件当中。例如:fopen、fclose函数用于文件打开与关闭;fscanf、fgets函数用于文件读取;fprintf、fputs函数用于文件写入;ftell、fseek函数用于文件操作位置的获取与设置。
2、例程:
#include《stdio.h》
int a;
char b,c;
int main(){
FILE * fp1 = fopen("input.txt", "r");//打开输入文件
FILE * fp2 = fopen("output.txt", "w");//打开输出文件
if (fp1==NULL || fp2==NULL) {//若打开文件失败则退出
puts("不能打开文件!");
return 0;
}
fscanf(fp1,"%d",&a);//从输入文件读取一个整数
b=fgetc(fp1);//从输入文件读取一个字符
fgets(c,100,fp1);//从输入文件读取一行字符串
printf("%ld",ftell(fp1));//输出fp1指针当前位置相对于文件首的偏移字节数
fputs(c,fp2);//向输出文件写入一行字符串
fputc(b,fp2);//向输出文件写入一个字符
fprintf(fp2,"%d",a);//向输出文件写入一个整数
fclose(fp1);//关闭输入文件
fclose(fp2);//关闭输出文件,相当于保存
return 0;
}
c语言中读取及输出汉字的问题
为了方便文本文件的操作,标准函数编程库提供了,行读写函数,
char *gets(char *s);
char *fgets(char *s, int n, FILE *stream);
-----------------------精通unix下c语言编程与项目实践P66
行输出函数族
int puts(const char *s);
int fputs(const char *s, FILE *stream);
-----------------------精通unix下c语言编程与项目实践P67
块读写函数
能够输入输出任意数量的字符,在操作二进制文件时常常使用,
fread 和fwrite
块读写函数经常操作二进制文件。
-----------------------精通unix下c语言编程与项目实践P70
再有就是编码的知识了
当你输出的ascii码在汉字的范围内的时候,汉字系统会认识到
然后把相应的ascii码变成汉字。
c语言 如何读取中文字符串
可以使用输入输出重定向来将TXT文本中的字符内容导入程序中,或者使用标准C库函数:fopen()和fgetc();
先使用fopen()函数打开TXT文本文件,然后使用fgetc读取文本文件中的字符。读取全部文本中全部字符可以使用一个while循环加判断是否读取到文件结尾来实现:
char ch;
while((ch= fgetc(fp)) != EOF)
这样当读取到文件结尾时,while循环就会终止。
C语文编写编译如下:
#include 《stdio.h》
#include 《stdlib.h》
#include 《string.h》
#define MAXLINE 100000
#define BUFLEN 1024
int main()
{
FILE *file;
char buf;
int len=0,i=0;
char *array;
file=fopen("test.txt","r");//打开TXST.TxT文件
if(!file)return -1;
while(fgets(buf,BUFLEN,file))//读取TXT中字符
{
len=strlen(buf);
array=(char*)malloc(len+1);
if(!array)break;
strcpy(array,buf);
}
fclose(file);
i--;
while(i》=0&&array)
{
printf("%s\n",array);//打印test文档的字符
free(array);
}
}
将一句中文隐藏在c语言代码中
呵呵,写好了,完全符合你的要求,程序运行后你输入一段文字,然后它会自动进行转码并输出到save.txt中, 程序如下:
//这个程序只能对一段文字进行转码,若有多段,则用下面一个程序吧
#include 《stdio.h》
#include 《stdlib.h》
#include 《string.h》
#define MAX_SIZE 500
void convert(char *str) //将中文进行转码
{
FILE *fp;
fp = fopen("save.txt", "w");
if(!fp)
{
printf("创建save.txt文件失败!\n");
exit(0);
}
while(*str)
{
fprintf(fp, "\\x%02x", (unsigned char)*str++);
}
fclose(fp);
}
int main()
{
char str = "", *p;
printf("请输入一段中文(不超过%d个字符):\n", MAX_SIZE);
fgets(str, sizeof(str), stdin);
//fgets函数会接收回车符,可以用strchr函数在str中去找’\n’的位置,它会返回该位置的指针,如找不到则返回NULL
p = strchr(str, ’\n’);
if(p)
{
*p = ’\0’; //去除回车符
}
convert(str);
printf("\n\t转换成功!已存至与本源文件同一目录下的save.txt中!\n");
return 0;
}
//这个程序可对多段文字进行转码,把要转码的文字存放于与本源文件同一目录下的load.txt中即可
#include 《stdio.h》
#include 《stdlib.h》
#include 《string.h》
void convert()
{
char ch, escp;
FILE *fp_load, *fp_save;
fp_load = fopen("load.txt", "r");
if(!fp_load)
{
printf("无法打开load.txt文件!\n");
exit(0);
}
fp_save = fopen("save.txt", "w");
if(!fp_save)
{
printf("创建save.txt文件失败!\n");
exit(0);
}
while(!feof(fp_load))
{
ch = fgetc(fp_load);
sprintf(escp, "\\x%02x", (unsigned char)ch);
fprintf(fp_save, escp);
}
fclose(fp_save);
fclose(fp_load);
}
int main()
{
printf("该程序为中文转码程序.\n");
printf("把你要转换的中文存放至与本源文件处于同一目录下的load.txt中.\n");
printf("准备就绪后,按回车键开始!\n");
getchar();
convert();
printf("\n\t转换成功!已存至与本源文件同一目录下的save.txt中!\n");
return 0;
}
//当然,能将文件中的中文进行转码成\xhh形式,肯定也能对这样形式的文件进行反转码成中文,经过我一天一夜的编程,终于实现了,也一并给你吧.如果你觉得没必要的话就不用看下面这代码了:
#include 《stdio.h》
#include 《stdlib.h》
#include 《string.h》
#include 《math.h》
#define OCTAL 8 //八进制
#define HEX 16 //十六进制
int to_decimal(int scale, const char *str, int len) //将长度为len的scale进制字符串转换成十进制
{
int i;
double sum;
sum = 0;
if(HEX == scale)
{
for(i=0; i《len; i++)
{
if((str《= ’9’))
{
sum += (str-’0’) * pow(HEX, len-i-1);
}
else if((str 《= ’f’))
{
sum += (10+str-’a’) * pow(HEX, len-i-1);
}
else if((str 《= ’F’))
{
sum += (10+str-’A’) * pow(HEX, len-i-1);
}
}
}
else if(OCTAL == scale)
{
for(i=0; i《len; i++)
{
sum += (str-’0’) * pow(OCTAL, len-i-1);
}
}
return (int)sum;
}
char convert(const char *escp_str) //将转义系列转换成对应转义后的字符
{
switch(escp_str)
{
case ’a’:
return ’\a’;
case ’b’:
return ’\b’;
case ’f’:
return ’\f’;
case ’n’ :
return ’\n’;
case ’r’:
return ’\r’;
case ’t’:
return ’\t’;
case ’v’:
return ’\v’;
case ’\\’:
return ’\\’;
case ’\’’:
return ’\’’;
case ’\"’:
return ’\"’;
case ’x’:
return to_decimal(HEX, escp_str+1, strlen(escp_str+1));
default:
return to_decimal(OCTAL, escp_str, strlen(escp_str));
}
}
void get_escp_str(FILE *fp, char *escp_str) //提取转义系列,将其存放至escp_str
{
int i;
escp_str = fgetc(fp);
switch(escp_str)
{
case ’a’: case ’b’: case ’f’: case ’n’ : case ’r’: case ’t’: case ’v’:
case ’\\’: case ’\’’: case ’\"’:
return;
case ’x’: //十六进制转义除去从escp_str),如’x000000aa’,则只读取’xaa’
for(i=1; i《3; i++)
{
escp_str = fgetc(fp);
if(EOF == escp_str)
{
escp_str = ’\0’;
return;
}
if(1 == i)
{
while(’0’ == escp_str开始连续的0
{
escp_str = fgetc(fp);
if(EOF == escp_str)
{
escp_str = ’\0’;
return;
}
}
}
if(((escp_str 》 ’f’))
&& ((escp_str 》 ’F’)))
{
fseek(fp, -1, SEEK_CUR);
escp_str = ’\0’;
return;
}
}
escp_str = ’\0’;
return;
default: //八进制转义码最多读取三位(包括escp_str)
for(i=1; i《3; i++)
{
escp_str = fgetc(fp);
if(EOF == escp_str)
{
escp_str = ’\0’;
return;
}
if((escp_str 》 ’7’))
{
escp_str = ’\0’;
fseek(fp, -1, SEEK_CUR);
return;
}
}
escp_str = ’\0’;
}
}
int is_escp_str(FILE *fp) //判断当前文件指针所指向字符是否开始转义
{
int ch;
if(EOF == (ch = fgetc(fp)))
return -1;
if(’\\’ != ch)
{
fseek(fp, -1, SEEK_CUR); //让文件指针fp重新指向字符ch
return 0;
}
if(EOF == (ch = fgetc(fp)))
return -1;
fseek(fp, -1, SEEK_CUR);
switch(ch)
{
case ’a’: case ’b’: case ’f’: case ’n’ : case ’r’: case ’t’: case ’v’:
case ’\\’: case ’\’’: case ’\"’: case ’0’: case ’1’: case ’2’: case ’3’:
case ’4’: case ’5’: case ’6’: case ’7’: case ’x’:
return 1;
}
return -1;
}
void convert_escape_str() //对转义字符串进行还原
{
char ch;
int res; //response,返回值
char escp_str = "";
FILE *fp_load, *fp_save;
fp_load = fopen("load.txt", "r");
if(!fp_load)
{
printf("无法打开load.txt文件!\n");
exit(0);
}
fp_save = fopen("save.txt", "w");
if(!fp_save)
{
printf("创建save.txt文件失败!\n");
exit(0);
}
while(!feof(fp_load))
{
res = is_escp_str(fp_load); //判断当前文件指针所指向字符是否开始转义
if(-1 == res)
continue;
else if(0 == res)
{
ch = fgetc(fp_load);
fputc(ch, fp_save);
}
else if(1 == res)
{
get_escp_str(fp_load, escp_str); //提取转义系列
fputc(convert(escp_str), fp_save); //将转义系列转换成对应转义后的字符写入save.txt
}
}
fclose(fp_save);
fclose(fp_load);
}
int main()
{
printf("该程序为转义字符串输出程序.\n");
printf("把你要输出的转义字符串存放至与本源文件处于同一目录下的load.txt中.\n");
printf("准备就绪后,按回车键开始!\n");
getchar();
convert_escape_str();
printf("\n\t转换成功!结果已存至与本源文件同一目录下的save.txt中!\n");
return 0;
}
若还有要求请追问:
c语言中用fgets从txt文件中获取中文字符串,一个中文是按两个字节还是三个字节来算
检查原始txt文件的编码格式,用记事本打开后另存为ANSI编码的文本文件,之后再重新尝试。
如果你安装了十六进制器,例如UltraEdit,也可以直接打开原始txt文档查看一下编码是什么样的,也可以直接输入汉字更改。

更多文章:
gridview排序功能属性(怎么把datagridview中的自动排序功能禁用)
2025年6月15日 08:45
易语言主程序和dll通讯(C+的dll如何用易语言正确调用)
2026年4月8日 14:30
怎么制作网站ping工具(ping是什么 如何ping一个站点)
2026年4月7日 09:15
前端样式网站(前端开发应该知道的几个CSS网页表单布局技巧)
2026年2月10日 21:15
flash模板照片幻灯片放映按钮代码解释?如何使用C#操作幻灯片
2025年7月24日 18:45
delphi bit定义(delphi中如何定义TBitmap类型的变量)
2025年11月14日 19:00
bankstatement中文(bank statement是什么意思)
2026年4月5日 01:45
linux如何编程(linux编程开发如何实现对智能手机的开发)
2025年12月23日 13:00
compareto方法实现(java中compareto实现学生成绩排列)
2026年4月28日 01:00
win8如何重装系统(怎么重新安装win8系统|win8如何重新安装系统)
2026年5月29日 06:45














