1.修改程序清单13.1中的程序,要求提示用户输入文件名,并读取用户输入的信息,不使用命令行参数。
#include <stdio.h>
#include <stdlib.h> // 提供exit() 的原型
#define BUF 256
char *s_gets(char *st, int n);
int main(int argc, char *argv[])
{
int ch; // 读取文件时,存储每个字符的地方
FILE *fp; // "文件指针"
unsigned long count = 0;
char filename[BUF];
fprintf(stdout, "Input file name:");
if ( s_gets(filename, BUF) ) // 也可写个循环,这里为了测试才写if
{
if ( (fp = fopen(filename, "r")) == NULL )
{
printf("Can't open %s\n", filename);
exit(EXIT_FAILURE);
}
while ( (ch = getc(fp)) != EOF )
{
putc(ch, stdout); // 与putchar(ch);相同
count++;
}
putc('\n', stdout);
fclose(fp);
printf("File %s has %lu characters\n", filename, count);
}
return 0;
}
char *s_gets(char *st, int n)
{
char *ret_val;
ret_val = fgets(st, n, stdin);
if ( ret_val )
{
while ( *st != '\n' && *st != '\0' )
st++;
if ( *st == '\n' )
*st = '\0';
else
while ( getchar() != '\n' )
continue;
}
return ret_val;
}
/*
输出结果:
Input file name:Hello
Hello World!
File Hello has 12 characters
*/
2.编写一个文件拷贝程序,该程序通过命令行获取原始文件名和拷贝文件名。尽量使用标准I\O和二进制模式。
自行预先创建两个文件,在命令函中输入两个文件名即可拷贝
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF 4096 // 创建512字节倍数的buffer
void cype_file(FILE *source, FILE *dest); // 使用二进制模式的读/写函数进行拷贝
int main(int argc, char *argv[])
{
FILE *fs, *fa; // fs(源文件),fa(目标拷贝文件)
if ( argc != 3 )
{
fprintf(stderr, "Usage: %s filename\n", argv[0]);
exit(EXIT_FAILURE);
}else if ( strcmp(argv[1], argv[2]) == 0 ) // 限定条件(无法拷贝自身)
{
fputs("Can't cype file to itself\n", stderr);
exit(EXIT_FAILURE);
}
if ( (fs = fopen(argv[1], "rb")) == NULL ) // 创建源文件
{
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}else if ( (fa = fopen(argv[2], "wb")) == NULL ) // 创建目标文件
{
fprintf(stderr, "Can't open %s\n", argv[2]);
exit(EXIT_FAILURE);
}else if ( setvbuf(fs, NULL, _IOFBF, BUF) != 0 ) // 创建源文件的完全缓冲区
{
fputs("Can't create output buffer\n", stderr);
exit(EXIT_FAILURE);
}else if ( setvbuf(fa, NULL, _IOFBF, BUF) != 0 ) // 创建目标文件的完全缓冲区
{
fputs("Can't create input buffer\n", stderr);
exit(EXIT_FAILURE);
}
cype_file(fs, fa); // 拷贝完成
fprintf(stdout, "Copy successfully!\n"); // 没有输出是因为,文件可能是二进制
fclose(fs);
fclose(fa);
return 0;
}
void cype_file(FILE *source, FILE *dest)
{
static char temp[BUF]; // 只分配一次
size_t bytes = 0L;
while ( (bytes = fread(temp, sizeof(char), BUF, source)) > 0 )
{
fwrite(temp, sizeof(char), bytes, dest);
}
}
3.编写一个文件拷贝程序,该程序通过用户输入文本文件名,并以该文件名和输出文件名。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define BUF 512 // 创建512字节倍数的buffer
void cype_file(FILE *fp); // 使用二进制模式的读/写函数进行拷贝
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
if ( argc != 2 )
{
fprintf(stderr, "Usage: %s filename\n", argv[0]);
exit(EXIT_FAILURE);
}
if ( (fp = fopen(argv[1], "rb+")) == NULL ) // 创建源文件
{
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}else if ( setvbuf(fp, NULL, _IOFBF, BUF) != 0 ) // 创建文件输入/输出的完全缓冲区
{
fputs("Unable to create output/output buffer\n", stderr);
exit(EXIT_FAILURE);
}
cype_file(fp); // 拷贝完成
fputs("Done.\n", stdout);
fclose(fp);
return 0;
}
void cype_file(FILE *fp)
{
static char temp[BUF]; // 只分配一次
size_t bytes = 0L;
char *st;
while ( (bytes = fread(temp, sizeof(char), BUF, fp)) > 0 )
{
st = temp;
while ( *st )
{
*st = toupper(*st);
st++;
}
rewind(fp); // 返回到文件开始处
fwrite(temp, sizeof(char), bytes, fp);
}
}
/*
输出结果(以下结果使用测试代码得出的结果):
./Copy Hello
--------------------------测试【拷贝前】
HELLO WORLD!
--------------------------测试【拷贝后】
HELLO WORLD!
--------------------------
Done.
*/
4.编写一个程序,按顺序在屏幕上显示命令行中列出的所有文件。使用argc控制语句。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
int i;
if ( argc < 2 ) //限定条件
{
fprintf(stderr, "Usage: %s filename\n", argv[0]);
exit(EXIT_FAILURE);
}
for ( i = 1