no1.c
// 修改程序清单13.1中的程序,要求提示用户输入文件名,并读取用户输入信息,不使用命令行参数.
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
int ch ;
FILE * fp ;
char st[100];
unsigned long count = 0 ;
printf("Please enter filename:");
scanf("%s" , st);
if ((fp = fopen(st , "r")) == NULL)
{
printf("Can't open %s\n" , st);
exit(EXIT_FAILURE);
}
while ((ch = getc(fp)) != EOF)
{
putc(ch , stdout);
count++ ;
}
fclose(fp);
printf("File %s has %lu characters\n" , st, count);
return 0 ;
}
no2.c
//编写一个文件拷贝程序,该程序通过命令行获取原始文件名和拷贝文件名.尽量使用标准I/O和二进制模式
# include <stdio.h>
# include <stdlib.h>
int main(int argc , char * argv[])
{
FILE * in , * out ;
char ch ;
size_t byt ;
if (argc != 3)
{
fprintf(stderr , "错误的参数.\n");
exit(EXIT_FAILURE);
}
if ((in = fopen(argv[1] , "rb")) == NULL)
{
fprintf(stderr , "打不开文件%s.\n" , argv[1]);
exit(EXIT_FAILURE);
}
if ((out = fopen(argv[2] , "wb")) == NULL)
{
fprintf(stderr , "打不开文件%s.\n" , argv[2]);
exit(EXIT_FAILURE);
}
while ((byt = fread(&ch , sizeof(ch) , 1 , in)) && !feof(in))
fwrite(&ch , sizeof(ch) ,1 , out);
if (fclose(in) || fclose(out))
{
fprintf(stderr , "退出失败.\n");
exit(EXIT_FAILURE);
}
return 0 ;
}
no3.c
// 编写一个文件拷贝程序,提示用户输入文件名,并以该文件名作为原始文件名和输出文件名,
// 该程序要使用ctype.h中的toupper()函数,在写入到输出
// 文件是把所有文本转换成大写.使用标准I/O和文本模式.
# include <stdio.h>
# include <stdlib.h>
# include <ctype.h>
int main(void)
{
char file[100];
char ch ;
FILE * fp ;
puts("Please enter file name :");
scanf("%s" , file);
if ((fp = fopen(file , "r+")) == NULL)
{
printf("Can't open the %s\n" , file);
exit(EXIT_FAILURE);
}
while ((ch = fgetc(fp)) != EOF)
{
if (islower(ch))
{
//当指定了“r+”、“w+”或“a+”访问类型时,
//将同时启用读写(文件被称为打开进行“更新”)。
//但是,当您从读取切换到写入时,输入操作必须遇到
//一个EOF标记。如果没有eof,则必须使用对文件定位函数的中间调用。
//以上就是我费尽九牛二虎之力查到的,如果没有重新定位,将无法写入
//我试过了很多方法
fseek(fp , - 1 , SEEK_CUR); //回退一个字符
putc(toupper(ch) , fp);
fseek(fp , 0 , SEEK_CUR); //定位到当前字符位置
}
}
if (fclose(fp) != 0)
printf("Error in closing files.\n");
return 0 ;
}
no4.c
//编写一个程序,按顺序在屏幕上显示命令行中列出的所有文件.使用argc控制循环
# include <stdio.h>
# include <stdlib.h>
int main(int argc , char * argv[])
{
FILE * fp ;
char ch ;
while (--argc > 0)
{
if (!(fp = fopen(*++argv , "r")))
{
fprintf(stderr , "打开%s文件失败.\n" , *argv);
continue ;
}
while ((ch = getc(fp)) != EOF)
putc(ch ,stdout);
if (fclose(fp))
{
fprintf(stderr , "退出%s文件失败.\n" , *argv);
exit(EXIT_FAILURE);
}
}
return 0 ;
}
no5.c
// 修改程序清单13.5中的程序,用命令行界面代替交互式界面.
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define BUFSIZE 4096
void append(FILE * source , FILE * dest);
char * s_gets(char * st , int n);
int main(int argc , char * argv[])
{
FILE * fa , * fs ;
int files = 0 ;
int ch ;
if (argc < 3)
{
fprintf(stderr , "参数错误.\n");
exit(EXIT_FAILURE);
}
if ((fa = fopen(argv[1] , "a+")) == NULL)
{
fprintf(stderr , "Can't open %s\n" , argv[1]);
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[1] , argv[i]) == 0)
fputs("Can't append file to itself\n" , stderr);
else if ((fs = fopen(argv[i] , "r")) == NULL)
fprintf(stderr , "Can't open %s\n" , argv[i]);
else
{
if (setvbuf(fs , NULL , _IOFBF , BUFSIZE) != 0)
{
fputs("Can't create input buffer\n" , stderr)