fgets,fgetws
char* fgets(char* string,int n,FILE* stream);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char buf[1024] = {0};
FILE* pfRead = fopen("F:\\aha\\test.txt", "r");
if (pfRead == NULL)
{
return 0;
}
//读文件
fgets(buf, 1024, pfRead);
printf("%s\n", buf);
fgets(buf, 1024, pfRead);
printf("%s\n", buf);
//关闭文件
fclose(pfRead);
pfRead = NULL;
return 0;
}
fputs,fputws
int fputs(const char* string,FILE* stream);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char buf[1024] = { 0 };
fgets(buf, 1024, stdin);
fputs(buf, stdout);
return 0;
}
问:fputs,fputws的区别?
ChatAI答:
fputs和fputws都是C标准库提供的输出函数,它们的主要区别在于输出的数据类型。
fputs用于将一个以null字符结尾的字符串输出到文件流中,即使用的是char类型的字符串。
fputws则是用于将一个以null为结尾的宽字符字符串输出到文件流中,即使用的是wchar_t类型的字符串。
另外,fputs返回值为非负整数,表示成功输出的字符数。而fputws返回值为非负整数,表示成功输出的宽字符数。
总之,fputs适用于输出普通字符串,fputws适用于输出宽字符字符串。
问:宽字符字符串是指的什么?
ChatAI答:
宽字符字符串是一种以wchar_t类型为基础单位的字符串,与标准的C字符串(char*)不同,宽字符字符串可以包含任意单个字节的字符串以及其他语言中使用的非ASCII字符(如日语中的汉字和假名等)和表情符号等。宽字符字符串在处理跨语言、多国语言的文本输入输出等场景中非常常用。
需要注意的是,在使用宽字符字符串时,需要使用相应的函数进行输入输出,这些函数的名称一般以“w”开头,如fputws、fwprintf等等。
问:中文属于宽字符字符串吗?
ChatAI答:
在大多数平台上,中文字符由多个字节组成。因此,中文字符并不属于宽字符字符串的范畴。
在Unicode标准中,每个字符都拥有一个独一无二的代码点(Code Point),其中包括中文字符。而对于宽字符类型wchar_t来说,在不同的平台上,它所占的字节数是不同的,在一些平台上,wchar_t可能仍然无法存储中文字符。因此在处理中文字符时,一般建议使用包含了中文支持的字符串库,例如GB18030、UTF-8等编码格式。
fprintf
int printf(const char* format[,argument]...);
int fprintf(FILE*stream,const char* format[,argument]...);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct S
{
int n;
float score;
char arr[10];
};
int main()
{
struct S s = { 100,3.14f,"Chung" };
FILE* pf = fopen("F:\\aha\\test.txt", "w");
if (pf == NULL)
{
return 0;
}
//格式化的形式写文件
fprintf(pf, "%d %f %s", s.n, s.score, s.arr);
fclose(pf);
pf = NULL;
return 0;
}
fscanf
int fscanf(FILE* stream,const char*format[,argument]...);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct S
{
int n;
float score;
char arr[10];
};
int main()
{
struct S s = { 0 };
FILE* pf = fopen("F:\\aha\\test.txt", "r");
if (pf == NULL)
{
return 0;
}
//格式化的输入数据
fscanf(pf,"%d %f %s",&(s.n),&(s.score),s.arr);
printf("%d %f %s\n", s.n, s.score, s.arr);
fclose(pf);
pf = NULL;
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct S
{
int n;
float score;
char arr[10];
};
int main()
{
struct S s = { 0 };
fscanf(stdin, "%d %f %s", &(s.n), &(s.score), s.arr);
fprintf(stdout, "%d %.2f %s", s.n, s.score, s.arr);
return 0;
}
sscanf,swscanf
int sscanf(const char* buffer,const char* format[,argument]...);
sprintf,swprintf
int sprintf(char* buffer,const char* format[,argument]...);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
struct S
{
int n;
float score;
char arr[10];
};
int main()
{
struct S s = { 100,3.14f,"abcdef" };
struct S tmp = { 0 };
char buf[1024] = { 0 };
//把格式化的数据转换成字符串存储到buf
sprintf(buf, "%d %f %s", s.n, s.score, s.arr);
//从buf中读取格式化的数据到tmp中
sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.score), tmp.arr);
printf("%d %f %s\n", tmp.n, tmp.score, tmp.arr);
return 0;
}
对比一组函数:
scanf/fscanf/sscanf
printf/fprintf/sprintf
scanf/printf 是针对标准输入流/标准输出流的格式化输入/输出语句
fscanf/fprintf 是针对所有输入流/所有输出流的格式化输入/输出语句
sscanf/sprintf 前者是从字符串中读取格式化的数据
后者是把格式化数据输出成(存储到)字符串
fwrite
size_t fwrite(const void* buffer,size_t size,size_t count,FILE* stream);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct S
{
char name[20];
int age;
double score;
};
int main()
{
struct S s = { "张三",20,55.6 };
FILE* pf = fopen("D:\\test.txt", "wb");
if (pf == NULL)
{
return 0;
}
//二进制的形式写文件
fwrite(&s, sizeof(struct S), 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
fread
size_t fread(void* buffer,size_t size,size_t count,FILE* stream);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct S
{
char name[20];
int age;
double score;
};
int main()
{
struct S tmp = { 0 };
FILE* pf = fopen("D:\\test.txt", "rb");
if (pf == NULL)
{
return 0;
}
//二进制的形式写文件
fread(&tmp, sizeof(struct S), 1, pf);
printf("%s %d %lf\n", tmp.name, tmp.age, tmp.score);
fclose(pf);
pf = NULL;
return 0;
}