字符读取函数的应用
下面的演示程序实现从/etc/passwd文件中提取用户名,打印到屏幕上并保存在copyname.txt文件中
使用的函数是getc()、putc()、putchar()
[c]
#include <stdio.h>
int main()
{
FILE *fpr, *fpw;
int c = 0, f = 0;
/* 以下打开源文件 */
if((fpr = fopen("/etc/passwd", "r")) == NULL)
{
printf("open file /etc/passwd failes.\n");
return;
}
/* 以下打开目标文件*/
if((fpw = fopen("./copyname.txt", "w")) == NULL)
{
printf("open file ./copyname.txt failed.\n");
fclose(fpr);
return;
}
while((c = getc(fpr)) != EOF)
{
/* 字符已经读取到了c */
if(f == 0)
{
if(c != ':')
putchar(putc(c, fpw));
else
f = 1;
}
else if(c == '\n')
{
f = 0;
putchar(putc(c, fpw));
}
}
fclose(fpr);
fclose(fpw);
return 0;
}
[/c]
行读写函数的应用
下面这个演示程序是按行来获取数据的
[c]
#include <stdio.h>
int main()
{
FILE *fpr, *fpw;
char buf[1024], *p1, *p2;
/* 打开源文件 */
if((fpr = fopen("/etc/passwd", "r")) == NULL)
{
printf("open /etc/passwd file failed.\n");
return;
}
/* 打开目标文件 */
if((fpw = fopen("./copynameid.txt", "w")) == NULL)
{
printf("open ./copynameid.txt failed.\n");
fclose(fpr);
return;
}
memset(buf, 0, sizeof(buf));
while(fgets(buf, sizeof(buf), fpr) != NULL)
{
/* p1指向第一个":",p2指向第二个":" */
if((p1 = strstr(buf, ":")) == NULL) break;
if((p2 = strstr(p1+1, ":")) == NULL) break;
p1++; p2++;
/* p1指向第二个域密码字段,p2指向第三个域用户ID字段 */
/* 以下代码移动字符串内容,将ID字段的内容移动到用户名字段后 */
while(*p2 != ':')
{
*p1 = *p2;
p1++; p2++;
}
*p1 = 0;
/* 屏幕输出 */
puts(buf);
/* 文件输出 */
fputs(buf, fpw);
fputs("\n", fpw);
/* 清楚内存 */
memset(buf, 0, sizeof(buf));
}
fclose(fpr);
fclose(fpw);
return 0;
}
[/c]
输出省略。这个程序很有意思的地方是在buf中利用指针直接判断并修改数据
越学越有意思呢