文章目录
1. 第1题
1.1 题目描述
修改程序清单中13.1中的程序,要求提示用户输入文件名,并读取用户输入的信息,不使用命令行参数。
1.2 编程源码
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[]){
int ch;
char name[40];
FILE *fp;
unsigned long count = 0;
printf("请输入文件名:");
scanf("%s", name);
if((fp=fopen(name,"r"))==NULL){
printf("Can`t open %s \n", argv[1]);
exit(EXIT_FAILURE);
}
while((ch=getc(fp))!=EOF){
putc(ch, stdout);
++count;
}
fclose(fp);
printf("File %s has %lu characters\n", name, count);
return 0;
}
1.3 结果显示
文档内容:
abc 123 ref 345
dog is running
cat is running
2. 第2题
2.1 题目描述
编写一个文件拷贝程序,该程序通过命令行获取原始文件名和拷贝文件名。尽量使用标准I/O和二进制模式。
2.2 编程源码
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[]){
if(argc<3){
printf("请按照程序 输入文件名 输出文件名 格式进行输入\n");
exit(EXIT_FAILURE);
}
FILE *in,*out;
if((in=fopen(argv[1],"r")) == NULL){
printf("%s 打开失败!\n", argv[1]);
exit(EXIT_FAILURE);
}
if((out=fopen(argv[2],"w"))==NULL){
printf("%s 打开失败!\n", argv[2]);
exit(EXIT_FAILURE);
}
char ch;
while((ch = getc(in)) && ch != EOF)
putc(ch,out);
fclose(in);
fclose(out);
return 0;
}
2.3 结果显示
原始文档:
#include<iostream>
int main(void){
const int i;
return 0;
}
拷贝后文档:
#include<iostream>
int main(void){
const int i;
return 0;
}
3. 第3题
3.1 题目描述
编写一个文件拷贝程序,提示用户输入文本文件名,并以该文件名作为原始文件名和输出文件名。该程序要使用ctype.h中的toupper函数,在写入到输出文件时把所有文本转换成大写。使用标准I/O和文本模式
3.2 编程源码
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[]){
char name[40];
char name2[40];
printf("请输入文件名:");
scanf("%s", name);
printf("请输出文件名:");
scanf("%s", name2);
FILE *in,*out;
if((in=fopen(name,"r")) == NULL){
printf("%s 打开失败!\n", name);
exit(EXIT_FAILURE);
}
if((out=fopen(name2,"w"))==NULL){
printf("%s 打开失败!\n", name2);
exit(EXIT_FAILURE);
}
char ch;
while((ch = getc(in)) && ch != EOF)
putc(ch,out);
fclose(in);
fclose(out);
return 0;
}
3.3 结果显示
test.c
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[]){
char name[40];
char name2[40];
printf("请输入文件名:");
scanf("%s", name);
printf("请输出文件名:");
scanf("%s", name2);
FILE *in,*out;
if((in=fopen(name,"r")) == NULL){
printf("%s 打开失败!\n", name);
exit(EXIT_FAILURE);
}
if((out=fopen(name2,"w"))==NULL){
printf("%s 打开失败!\n", name2);
exit(EXIT_FAILURE);
}
char ch;
while((ch = getc(in)) && ch != EOF)
putc(ch,out);
fclose(in);
fclose(out);
return 0;
}
a.txt
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[]){
char name[40];
char name2[40];
printf("请输入文件名:");
scanf("%s", name);
printf("请输出文件名:");
scanf("%s", name2);
FILE *in,*out;
if((in=fopen(name,"r")) == NULL){
printf("%s 打开失败!\n", name);
exit(EXIT_FAILURE);
}
if((out=fopen(name2,"w"))==NULL){
printf("%s 打开失败!\n", name2);
exit(EXIT_FAILURE);
}
char ch;
while((ch = getc(in)) && ch != EOF)
putc(ch,out);
fclose(in);
fclose(out);
return 0;
}
4. 第4题
4.1 题目描述
编写一个程序,按顺序在屏幕上显示命令行中列出的所有文件。使用argc控制循环。
4.2 编程源码
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[]){
for(int i=1;i<argc;++i){
puts(argv[i]);
}
return 0;
}
4.3 结果显示
5. 第5题
5.1 题目描述
修改程序清单13.5中的程序,用命令行界面代替交互式界面。
5.2 编程源码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFSIZE 4096
#define SLEN 81
void append(FILE *source, FILE *dest){
size_t bytes;
static char temp[BUFSIZE];
while((bytes = fread(temp, sizeof(char), BUFSIZE, source))>0)
fwrite(temp, sizeof(char),bytes, dest);
}
char* s_gets(char *st, int n){
char *ret_val;
char *find;
ret_val = fgets(st, n, stdin);
if(ret_val){
find = strchr(st, '\n');
if(find) *find = '\0';
else{
while(getchar()!='\n')continue;
}
}
return ret_val;
}
int main(int argc, char* argv[]){
if(argc<3){
printf("缺少文件,请按照格式输入\n");
exit(EXIT_FAILURE);
}
FILE *fa, *fs;
int files = 0;
char file_app[SLEN];
char file_src[SLEN];
int ch;
if((fa=fopen(argv[1], "a+"))==NULL){
fprintf(stderr, "Can`t open %s \n", file_app);
exit(EXIT_FAILURE);
}
if(setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0){
fputs("Can`t create output buffer\n", stderr);
exit(EXIT_FAILURE);
}
for(int i=2;i<argc;++i){
if(strcmp(argv[i], file_app) == 0){
fputs("Can`t append file to itself\n", stderr