326
edits
(→Day 93) |
(→Day 93) |
||
| Line 60: | Line 60: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
不过,有个小问题,如果是一篇文章,这样从终端输入的方式似乎就不太好,对吧。实用性不高,那读取文件呢? | |||
<syntaxhighlight lang="c" line style="border: 1px dashed red;"> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
// encrypt | |||
void encrypt(char *str, int key) | |||
{ | |||
int len = strlen(str); | |||
for (int i = 0; i < len; i++) | |||
{ | |||
str[i] += key; | |||
} | |||
} | |||
// decrypt | |||
void decrypt(char *str, int key) | |||
{ | |||
int len = strlen(str); | |||
for (int i = 0; i < len; i++) | |||
{ | |||
str[i] -= key; | |||
} | |||
} | |||
int main() | |||
{ | |||
char filename[100]; | |||
char buffer[1024]; | |||
int key; | |||
// OK, read a file, fancy right? | |||
printf("请输入要读取的文件名:"); | |||
scanf("%s", filename); | |||
printf("请输入密钥:"); | |||
scanf("%d", &key); | |||
// let's encrypt what do you want, and, write back result, more fancy, right? | |||
// Do you want write a user interface: user choose 'encrypt' or 'decrypt' | |||
FILE *fp = fopen(filename, "r"); | |||
if (fp == NULL) | |||
{ | |||
printf("无法打开文件 %s\n", filename); | |||
return 1; | |||
} | |||
fseek(fp, 0L, SEEK_END); // 定位到文件末尾 | |||
long size = ftell(fp); // 获取文件大小 | |||
fseek(fp, 0L, SEEK_SET); // 定位到文件开头 | |||
fread(buffer, sizeof(char), size, fp); // 读取整个文件 | |||
fclose(fp); | |||
// do it! | |||
encrypt(buffer, key); | |||
// Done! cool. | |||
fp = fopen(filename, "a"); | |||
if (fp == NULL) | |||
{ | |||
printf("无法打开文件 %s\n", filename); | |||
return 1; | |||
} | |||
fprintf(fp, "\n\n加密后的内容:\n%s", buffer); | |||
fclose(fp); | |||
printf("加密完成!\n"); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
感觉不错。但是是不是可以进一步优化一下下?譬如,写几句,让用户选择是加密还是解密,然后呢,再执行加密或解密的算法?这个小玩具够这个周五的晚上玩儿一阵子的了吧,哈哈哈。 | |||
== Day 92 == | == Day 92 == | ||