CH7-2 输入输出 File

7.5 File Access
#include <stdio.h>
/*
* FILE // fopen, getc, putc, fclose // stdin, stdout, stderr // NULL
*(1) FILE *fp; //file pointer
*(2) FILE *fopen(char *fileName, char *mode); // fp = fopen (fileName, mode);
*(3) read ("r"), write ("w"), append ("a")
*(4) 为了区分 text文件和binary文件,可以在以上三种打开方式后面加上 "b" (binary file)
*(5) 若"a"或者"w"时,若这个文件不存在,将会新创建(create)一个文件
*(6) 若文件已存在,当"a"时,文件以前的内容将保留;若"w"时,将覆盖。
*(7) fopen打开文件失败时,回返回NULL指针,原因可能是"r"读一个不存在的文件,或者权限不够
*(8) 当c程序执行时,OS负责打开三个标准文件指针,分别为stdin, stdout, stderr
*/
//int getc(FILE *fp)读fp指向stream的下一个字符,当文件结尾或出错时,返回EOF。
//int putc(char ch, FILE *fp)向fp中写入一个字符,并返回该字符,出错时返回EOF。
//#define getchar()    getc(stdin)
//#define putchar(c) putc(c, stdout)
void fileCopy(FILE *sourceFile, FILE *targetFile){
         int ch;
         while((ch = getc(sourceFile)) != EOF)    
                putc(ch, targetFile);
}

int main( int argc, char** argv) {
        FILE *sourceFile, *targetFile;
         char *sourceFileName = "source.txt", *targetFileName = "target.txt";
        
         if((sourceFile = fopen(sourceFileName, "rb")) == NULL){
                printf( "Error: can't open %s\n", sourceFileName);
        } else if((targetFile = fopen(targetFileName, "ab")) == NULL){
                printf( "Error: can't open %s\n", targetFileName);
        }
         //stdout 标准输出文件 FILE *fp
         if((sourceFile != NULL)&&(targetFile != NULL)){
                fileCopy(sourceFile, targetFile);    
                 //fileCopy(sourceFile, stdout); //如果把这行打开,stdout将无显示,
                                                      //原因是sourceFile指针已经到了文件尾了
        }
         //关闭文件指针 fclose(FILE *fp)
        fclose(sourceFile);
        fclose(targetFile);
         return 0;
}
 
#include <stdio.h>
/*
* int fscanf(FILE *fp, char *format, ...) //从文件中读值给参数变量
* int fprintf(FILE *fp, char *format, ...)//将参数的值写到文件中
*/
int main( int argc, char** argv) {
        FILE *fp;
         char *fileName = "source.txt";
         int tmp;

         if((fp = fopen(fileName, "r+ab")) == NULL){
                printf( "Error: can't open %s\n", fileName);
        } else {
                fscanf(fp, "%d", &tmp);
                printf( "the number is: %d\n", tmp);
                fprintf(fp, "%o", tmp);
                printf( "check the file whether there is one copy number with octal!");
        }
        fclose(fp);
         return 0;
}
7.6 Error Handling - stderr 和exit
#include <stdio.h>
#include <stdlib.h>
//stderr将会打印在screen上,即使标准输出被重定向到文件或者其他程序的pipeline
//可以借助fprintf将错误信息分流到stderr,其他的输出不受影响
void fileCopy(FILE *sourceFile, FILE *targetFile){
         int ch;
         while((ch = getc(sourceFile)) != EOF)
                putc(ch, targetFile);
}
/*
* int ferror (FILE *fp) //当fp发生错误时,ferror返回非0
* int feof(FILE *fp) //当fp到达文件尾时,feof返回非0
*/
void main1( int argc, char* argv[]) { //argv[i]代表一个文件名
        FILE *fp;
         //argv[0]是一个指向char*的指针变量,可以指向一个字符串(文件名)
         char *progName = argv[0];     //程序名

         if(argc == 1)     //如果没有其他参数(只有程序名),则将stdin的输入打印到stdout
                fileCopy(stdin, stdout);
         else {
                 while(--argc > 0){
                         if((fp = fopen(*++argv, "r")) == NULL){ //借助fprintf将错误信息分流到stderr
                                fprintf(stderr, "%s: can't open %s\n", progName, *argv);    
                                exit(1); //在错误信息中,把progName打印进去,防止和其他程序打印的错误信息混淆
                        } else{
                                fileCopy(fp, stdout);
                                fclose(fp);
                        }
                }
        }
         //int ferror(FILE *fp) 当fp发生错误时,ferror返回非0
         if(ferror(stdout)){ //输出错虽然少,但也有可能,例如磁盘满
                fprintf(stderr, "%s: error writing stdout\n", progName);
                exit(2);
        }
        
        exit(0); //标准库函数exit,0表示正常结束 //和return相似,但
         //父进程可以通过检验exit的{返回值}来判断程序执行成功或失败
}
7.6  Line input and output
fgets
#include <stdio.h>
#include <stdlib.h>
/*    
* char *fgets(char *line, int maxline, FILE *fp)
* 从fp中最多读maxline-1个字符到line字符数组中,line以'\0'结尾
*/
#define maxLine 30
int main( int argc, char** argv) {
         char *fileName = "test.txt";
         char line[maxLine]; //char *line; 也可以
        FILE *fp;
         if((fp = fopen(fileName, "r")) == NULL){
                fprintf(stderr, "%s can't open.\n", fileName);
                exit(1);
        }
         char *result;     //当出错或者文件尾,fgets返回NULL
         while((result = fgets(line,maxLine, fp)) != NULL){
                printf( "result is: %s\n", result);
                printf( "line is: %s\n", line);
        }
        fclose(fp);
         return (EXIT_SUCCESS);
}
fputs
#include <stdio.h>
#include <stdlib.h>
/*    
* int *fputs(char *line, FILE *fp)
* 向fp中写入一行line
*/
int main( int argc, char** argv) {
         char *fileName = "test.txt";
         char *line = "\nHello World!\n";
        FILE *fp;
         if((fp = fopen(fileName, "ab")) == NULL){
                fprintf(stderr, "%s can't open.\n", fileName);
                exit(1);
        }
        
         if(fputs(line, fp) == EOF){ //若出错,fputs返回EOF,否则返回非0
                fprintf(stderr, "write %s to %s fails.\n", line, fileName);
                exit(1);
        }        
        fclose(fp);
         return (EXIT_SUCCESS);
}

你可能感兴趣的:(职场,休闲)