学校C语言实验——文件
本文章为非计算机学院的实验以及解答,也是用最基础最入门的方式写完的!
老规矩,先写上头文件:
#include "stdafa.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
因为我写C都是抱着头文件可以多不能少的思路弄得,所以头文件会长一些。
这里还需要补充一下:如果一下代码您使用后是乱码的话,那可能是txt文件的格式不正确们需要打开txt文件,点击文件->另存为->选在地方,保存的左边有一个格式的调成ASNI即可
正文:
一、自己用记事本输入一些文字(可以是汉字),然后写程序:
(1)将文件内容输出到屏幕
(2)将它复制并生成另一文本文件。
1.1将文件内容输出到屏幕
先把文本文档内容放在下面:
在完成1.1时我发现我当时写C语言实验的代码不能用了,然后用了几个函数都=都是不能完整输出,所以最后迫不得已使用了fscanf函数读取文件。具体每个函数有什么问题,我暂时还没有找出来,希望知道的大佬博主或者大佬读者们可以联系我,我这里会把所以代码给出,放到目录,不愿意看的可以直接看正确的代码。
可以正确输出的fscanf函数代码:
int main() {
FILE* fp;
char str[1024];
int len;
fp = fopen("C:\\Users\\31869\\source\\repos\\C语言实验\\回答.txt", "r");
if (fp == NULL){
perror("ERROR!!!");
exit(1);
}
while (fscanf(fp, "%s", str) != EOF) {
printf("%s", str);
}
fclose(fp);
system("pause");
return 0;
}
下面来解释一下,因为我的txt没有跟程序弄到同一个文档上,所以开始运行的时候总是找不到文件,所以使用了perror函数,这个函数很好用,可以直接告诉我报错的原因。
对于不在一个同一个文件夹下的txt或者其他文件,想要打开就要如同我这个回答.txt一样。
但是这个格式依然不理想,如下:
fgetc函数:
int main() {
FILE* fp;
char ch;
char str[1024];
int len;
fp = fopen("C:\\Users\\31869\\source\\repos\\C语言实验\\回答.txt", "r");
if (fp == NULL){
perror("ERROR!!!");
exit(1);
}
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
fclose(fp);
system("pause");
return 0;
}
运行结果如下,展示了最后一行:
fgets函数:
int main() {
FILE* fp;
char ch;
char str[1024];
int len;
fp = fopen("C:\\Users\\31869\\source\\repos\\C语言实验\\回答.txt", "r");
if (fp == NULL){
perror("ERROR!!!");
exit(1);
}
while (fgets(str, sizeof(str), fp) != NULL) {
printf("%s", str);
}
fclose(fp);
system("pause");
return 0;
}
运行结果:
1.2复制到另一文本文件
代码:
int main() {
FILE* fp ,* gp;
char ch;
char str[1024];
int len;
fp = fopen("C:\\Users\\31869\\source\\repos\\C语言实验\\回答.txt", "r");
if (fp == NULL){
perror("ERROR!!!");
exit(1);
}
gp = fopen("C:\\Users\\31869\\source\\repos\\C语言实验\\复制.txt", "r+");
while((ch=fgetc(fp))!=EOF){
fputc(ch, gp);
}
printf("finish copy!\n");
fclose(fp);
system("pause");
return 0;
}
运行结果如下:
事先声明,这绝对不是我自己打进去的嗷,不信你们可以自己试一试。
二、编写一程序,把从键盘读取文字并存入mytest1.txt中,输入时以字符^z(ASCII码26或EOF)作为结束
代码:
int main() {
FILE* fp; char ch;
if ((fp = fopen("C:\\Users\\31869\\source\\repos\\C语言实验\\mytest1.txt", "w+")) == NULL) {
perror("error!");
exit(0);
}
printf("写入(以^Z 结尾):\n");
ch = getchar();
while (ch != 26)
{
fputc(ch, fp);
ch = getchar();
}
rewind(fp);
while ((ch = fgetc(fp)) != EOF)
putchar(ch);
printf("\n");
fclose(fp);
return 0;
}
其实^Z就是Ctrl+Z结束,也是26或者EOF结束。
下面看输入和运行结果:
txt:
好了,这个完美解决。
三、对以下结构
typedef struct student{
int no; //学号
char name[10]; //姓名
int score; //成绩
}STUD;
1、main中定义数组a[3],b[3];
2、写indata函数从键盘输入数据到数组a[3]中;
3、写函数outdata输出a[3];
4、写writef函数将a[3]存入文件“student.txt”中;
5、写readf函数将文件“student.txt”读取到数组b[3];
6、输出数组b[3]中的数据。
T3代码
indata函数:
void indata(STUD* p, int n) {
int i;
for (i = 0;i < n;i++) {
scanf("%d,%s,%d", &(p[i].no), p[i].name, &(p[i].score));
}
}
outdata函数:
void outdata(STUD* p, int n) {
for (int i = 0;i < n;i++)
printf("%d %s %d\n", p[i].no, p[i].name, p[i].score);
}
writef函数:
void writef(STUD* p, int n) {
FILE* fp;
fp = fopen("C:\\Users\\31869\\source\\repos\\C语言实验\\student.txt", "w+");
for (int i = 0;i < n;i++)
fprintf(fp, "%d %s %d \n",
p[i].no, p[i].name, p[i].score);
fclose(fp);
}
readf函数:
void readf(STUD* p, int n) {
FILE* fp;
fp = fopen("d:\\student.txt", "rb");
for (int i = 0;i < n;i++)
fscanf(fp, "%d%s%d",
&(p[i].no), p[i].name, &(p[i].score));
fclose(fp);
}
完整代码:
typedef struct student {
int no;
char name[10];
int score;
}STUD;
void indata(STUD* p, int n);
void outdata(STUD* p, int n);
void writef(STUD* p, int n);
void readf(STUD* p, int n);
int main() {
STUD a[3], b[3];
indata(a, 3);
outdata(a, 3);
writef(a, 3);
readf(b, 3);
outdata(b, 3);
}
void indata(STUD* p, int n) {
int i;
for (i = 0;i < n;i++) {
scanf("%d,%s,%d", &(p[i].no), p[i].name, &(p[i].score));
}
}
void outdata(STUD* p, int n) {
for (int i = 0;i < n;i++)
printf("%d %s %d\n", p[i].no, p[i].name, p[i].score);
}
//格式读写
void writef(STUD* p, int n) {
FILE* fp;
fp = fopen("C:\\Users\\31869\\source\\repos\\C语言实验\\student.txt", "w+");
for (int i = 0;i < n;i++)
fprintf(fp, "%d %s %d \n",
p[i].no, p[i].name, p[i].score);
fclose(fp);
}
void readf(STUD* p, int n) {
FILE* fp;
fp = fopen("d:\\student.txt", "rb");
for (int i = 0;i < n;i++)
fscanf(fp, "%d%s%d",
&(p[i].no), p[i].name, &(p[i].score));
fclose(fp);
}
T3运行结果:
输入:
student.txt:
四、总结:
到了这里,我们的C语言所有实验就弄完了,但是我在另一篇完整中说过后续会更新一下关于排序或者矩阵的博客,看大家投票,更更想要看哪个,之后就发哪个吧。