fgets和fscanf的对比
时间: 2024-06-15 09:07:29 浏览: 128
fgets和fscanf是C语言中用于读取文件内容的两个函数,它们有以下几点不同之处:
1. 读取方式:fgets函数以行为单位读取文件内容,而fscanf函数以格式化字符串为单位读取文件内容。
2. 参数不同:fgets函数需要传入三个参数,分别是要读取的字符串缓冲区、最大读取字符数和文件指针;而fscanf函数需要传入两个参数,分别是文件指针和格式化字符串。
3. 返回值不同:fgets函数返回读取到的字符串指针,如果读取失败则返回NULL;而fscanf函数返回成功匹配并赋值的参数个数,如果读取失败则返回EOF。
4. 处理空格和换行符:fgets函数会将读取到的换行符也存储在字符串缓冲区中,而fscanf函数会自动跳过空格和换行符。
5. 读取格式不同:fgets函数会将整行内容读取到字符串缓冲区中,包括空格和换行符;而fscanf函数可以根据格式化字符串指定要读取的数据类型和格式。
相关问题
// 从文件中读取用户名和密码 FILE* fp = fopen("User_list.txt", "r"); fscanf(fp, "%s %s", List_username, List_password); fclose(fp); // 获取界面上输入的用户名和密码 GetCtrlVal(L_Panel, L_username_CtrlID, username); GetCtrlVal(L_Panel, L_password_CtrlID, password); // 比较用户名和密码是否匹配 if (strcmp(username, List_username) == 0 && strcmp(password, List_password) == 0) { MessagePopup("欢迎", "密码正确!"); } else { MessagePopup("错误", " 用户不存在或密码不正确!"); } }如何将该段代码优化为可将用户输入和整个txt文件对比
可以使用一个循环来遍历整个文件,逐行读取用户名和密码进行比较。以下是一个可能的优化代码:
```
// 获取界面上输入的用户名和密码
GetCtrlVal(L_Panel, L_username_CtrlID, username);
GetCtrlVal(L_Panel, L_password_CtrlID, password);
// 打开文件并逐行读取
FILE* fp = fopen("User_list.txt", "r");
char line[100];
bool match_found = false;
while (fgets(line, 100, fp)) {
// 分离用户名和密码
char List_username[50], List_password[50];
sscanf(line, "%s %s", List_username, List_password);
// 如果用户名和密码匹配,显示欢迎消息并退出循环
if (strcmp(username, List_username) == 0 && strcmp(password, List_password) == 0) {
MessagePopup("欢迎", "密码正确!");
match_found = true;
break;
}
}
// 关闭文件并显示错误消息(如果没有找到匹配)
fclose(fp);
if (!match_found) {
MessagePopup("错误", " 用户不存在或密码不正确!");
}
```
这个代码使用了一个 `while` 循环来逐行读取文件,每次读取一行并解析出用户名和密码进行比较。如果找到了匹配,就显示欢迎消息并设置一个标志变量 `match_found` 为 `true`,然后退出循环。如果没有找到匹配,就在循环结束后显示错误消息。
要求:1)从终端读入字符集大小为n,及n个字符和n个权值,建立哈夫曼树,进行编码并且输出,并将它存于文件hfmtree中。2)利用已建好的哈夫曼编码文件hfmtree,对存储于文件中的某正文进行编码。输出字符正文,再输出该文的二进制码。3)对2)的编码进行译码,译码结果存储到文件中,并与编码前的文件对比。程序编写C语言
好的,我已经了解你的要求了。下面是代码实现,我将分为三部分进行解释。
第一部分:建立哈夫曼树并进行编码
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
typedef struct Node{
int weight;
int parent;
int lchild;
int rchild;
char c;
}HuffNode, *HuffTree;
typedef struct Code{
char ch;
char bits[MAX];
}HuffCode;
void CreateHuffTree(HuffTree HT, int n){
int i, j, k, min1, min2;
for(i = 1; i <= n; i++){
HT[i].weight = getchar() - '0';
HT[i].c = getchar();
getchar();
}
for(i = 1; i <= 2 * n - 1; i++){
HT[i].parent = HT[i].lchild = HT[i].rchild = 0;
}
for(i = n + 1; i <= 2 * n - 1; i++){
min1 = min2 = MAX;
for(j = 1; j < i; j++){
if(!HT[j].parent){
if(HT[j].weight < min1){
min2 = min1;
min1 = HT[j].weight;
k = j;
}
else if(HT[j].weight < min2){
min2 = HT[j].weight;
}
}
}
HT[k].parent = i;
HT[i].lchild = k;
HT[i].weight = min1 + min2;
min1 = min2 = MAX;
for(j = 1; j < i; j++){
if(!HT[j].parent){
if(HT[j].weight < min1){
min2 = min1;
min1 = HT[j].weight;
k = j;
}
else if(HT[j].weight < min2){
min2 = HT[j].weight;
}
}
}
HT[k].parent = i;
HT[i].rchild = k;
HT[i].weight = min1 + min2;
}
}
void HuffCodeing(HuffTree HT, HuffCode HC[], int n){
int i, j, c, p;
char cd[MAX];
int start;
cd[n - 1] = '\0';
for(i = 1; i <= n; i++){
HC[i].ch = HT[i].c;
start = n - 1;
for(c = i, p = HT[i].parent; p != 0; c = p, p = HT[p].parent){
if(HT[p].lchild == c){
cd[--start] = '0';
}
else{
cd[--start] = '1';
}
}
strcpy(HC[i].bits, &cd[start]);
}
}
int main(){
int n;
scanf("%d", &n);
HuffTree HT = (HuffTree)malloc(sizeof(HuffNode) * (2 * n));
HuffCode HC[MAX];
CreateHuffTree(HT, n);
HuffCodeing(HT, HC, n);
FILE* fp = fopen("hfmtree", "w+");
for(int i = 1; i <= n; i++){
fprintf(fp, "%c %s\n", HC[i].ch, HC[i].bits);
}
fclose(fp);
free(HT);
return 0;
}
```
这部分主要实现了建立哈夫曼树及对其进行编码的功能。首先读入字符集大小n及n个字符和权值,然后根据这些权值建立哈夫曼树。接着,构建哈夫曼编码,将哈夫曼编码存入结构体中。最后将编码存储于文件hfmtree中。
第二部分:利用已建好的哈夫曼编码文件hfmtree,对存储于文件中的某正文进行编码
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
typedef struct Code{
char ch;
char bits[MAX];
}HuffCode;
int main(){
FILE* fp = fopen("hfmtree", "r");
char ch;
int i = 0;
HuffCode HC[MAX];
while(fscanf(fp, "%c %s\n", &HC[i].ch, HC[i].bits) != EOF){
i++;
}
fclose(fp);
fp = fopen("text", "r");
char text[MAX];
fgets(text, MAX, fp);
fclose(fp);
fp = fopen("code", "w+");
int len = strlen(text);
for(int i = 0; i < len; i++){
for(int j = 0; j < strlen(HC[text[i] - 'a'].bits); j++){
fprintf(fp, "%c", HC[text[i] - 'a'].bits[j]);
}
}
fclose(fp);
return 0;
}
```
这部分主要实现了对文件进行哈夫曼编码的功能。首先读入文件hfmtree中的哈夫曼编码,然后读入需要编码的文件,接着对文件进行哈夫曼编码,将编码存入文件code中。
第三部分:对哈夫曼编码进行译码并与编码前的文件对比
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
typedef struct Node{
int weight;
int parent;
int lchild;
int rchild;
char c;
}HuffNode, *HuffTree;
typedef struct Code{
char ch;
char bits[MAX];
}HuffCode;
int main(){
FILE* fp = fopen("hfmtree", "r");
char ch;
int i = 0;
HuffCode HC[MAX];
while(fscanf(fp, "%c %s\n", &HC[i].ch, HC[i].bits) != EOF){
i++;
}
fclose(fp);
fp = fopen("code", "r");
char code[MAX];
fgets(code, MAX, fp);
fclose(fp);
fp = fopen("decode", "w+");
int len = strlen(code);
char text[MAX];
int j = 0;
for(int i = 0; i < len; i++){
text[j] = code[i];
for(int k = 0; k < i; k++){
if(strcmp(HC[text[k] - 'a'].bits, "") == 0){
continue;
}
if(strncmp(&code[k], HC[text[k] - 'a'].bits, strlen(HC[text[k] - 'a'].bits)) == 0){
i = k + strlen(HC[text[k] - 'a'].bits) - 1;
j++;
text[j] = '\0';
fprintf(fp, "%c", HC[text[k] - 'a'].ch);
text[j] = '\0';
break;
}
}
}
fclose(fp);
fp = fopen("text", "r");
char old_text[MAX];
fgets(old_text, MAX, fp);
fclose(fp);
fp = fopen("decode", "r");
char new_text[MAX];
fgets(new_text, MAX, fp);
fclose(fp);
if(strcmp(old_text, new_text) == 0){
printf("Decode Succeed!\n");
}
else{
printf("Decode Failed!\n");
}
return 0;
}
```
这部分主要实现了对哈夫曼编码进行译码并与编码前的文件对比的功能。首先读入文件hfmtree中的哈夫曼编码和编码后的文件,然后对编码进行译码,将译码结果存储于文件decode中。接着,读入编码前的文件和编码后的文件,进行对比,判断译码是否成功。
以上就是对你要求的一个简单实现,希望能够帮助到你。
阅读全文