<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    BeautifulMan

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      16 隨筆 :: 0 文章 :: 0 評論 :: 0 Trackbacks
    書中的一個例子,我也是想了半天了!!!有點難度!!!
    /* 把多個文件的內(nèi)容追加到一個文件中 */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define BUFSIZE 1024
    #define SLEN 81
    void append(FILE *source, FILE *dest);

    int main(void)
    {
        FILE *fa, *fs;  // fa指向追加的目的文件, fs指向源文件
        int files = 0;  // 追加文件的個數(shù)
        char file_app[SLEN]; // 被追加文件的名稱
        char file_src[SLEN]; // 源文件的名稱
        puts("Enter name of destination file: ");
        gets(file_app);
        // "a":打開一個文本文件,可以寫入文件,向已有文件的尾部追加內(nèi)容,如果
        
    // 該文件不存在則先創(chuàng)建之
        if((fa = fopen(file_app, "a")) == NULL)
        {
            fprintf(stderr, "Can't open %s\n", file_app);
            exit(2);
        }
        /*
          創(chuàng)建一個輸出緩沖區(qū)
          NULL---函數(shù)會自動為自己分配一個緩沖區(qū);
          BUFSIZE---其大小為1024byte;
          _IOFBF---完全緩沖(緩沖區(qū)滿的時候刷新)
        
    */
        if(setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0)
        {
            fputs("Can't create output buffer\n", stderr);
            exit(3);
        }
        puts("Enter name of first source file (empty line to quit): ");
        while(gets(file_src) && file_src[0] != '\0')
        {
            if(strcmp(file_src, file_app) == 0)
                fputs("Can't append file to itself\n", stderr);
            else if((fs = fopen(file_src, "r")) == NULL)
                fprintf(stderr, "Can't open %s\n", file_src);
            else
            {
                /*
                  創(chuàng)建一個輸入緩沖區(qū)
                  NULL---函數(shù)會自動為自己分配一個緩沖區(qū);
                  BUFSIZE---其大小為1024byte;
                  _IOFBF---完全緩沖(緩沖區(qū)滿的時候刷新)
                
    */
                if(setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)
                {
                    fputs("Can't create input buffer\n", stderr);
                    continue;
                }
                append(fs, fa);
                // 發(fā)生讀取錯誤
                if(ferror(fs) != 0)
                    fprintf(stderr, "Error in reading file %s.\n", file_src);
                // 發(fā)生寫入錯誤
                if(ferror(fa) != 0)
                    fprintf(stderr, "Error in writing file %s.\n", file_app);
                fclose(fs);
                files++;
                printf("File %s appended.\n", file_src);
                puts("Next file(empty line to quit): ");
            }
        }
        printf("Done. %d files appended.\n", files);
        fclose(fa);

        return 0;
    }
    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);
    }
    我的運(yùn)行結(jié)果:

    確實追加成功!!!

    復(fù)習(xí)題
    1、下面的程序有什么問題?
    int main(void)
    {
        int * fp;
        int k;

        fp = fopen("gelatin");
        for(k = 0; k < 30; k++)
            fputs(fp, "Nanette eats gelatin.");
        fclose("gelatin");
        return 0;
    }
    答:(參考課后答案)
    因為程序中有文件定義,所以應(yīng)該有#include<stdio.h>。應(yīng)該把fp聲明為文件指針:FILE *fp;。函數(shù)fopen()需要一種模式:fopen("gelatin", "w");或"a"模式。fputs()函數(shù)中參數(shù)的次序應(yīng)該反過來。為了清除起見,輸出字符串應(yīng)該具有一個換行符,因為fputs()并不自動添加它。fclose()函數(shù)需要一個文件指針而不是文件名:fclose(fp);。下面是一個正確的版本:
    #include <stdio.h>
    int main(void)
    {
        FILE * fp;
        int k;

        fp = fopen("gelatin", "w");
        for(k = 0; k < 30; k++)
            fputs("Nanette eats gelatin.\n", fp);
        fclose(fp);
        return 0;
    }
    2、下面程序的作用是什么?(Macintosh用戶可以假設(shè)程序正確地使用了console.h和ccommand()函數(shù)。)
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    int main(int argc, char *argv[])
    {
        int ch;
        FILE * fp;

        if(argc < 2)
            exit(2);
        if((fp = fopen(argv[1], "r")) == NULL)
            exit(1);
        while((ch = getc(fp)) != EOF)
            if(isdigit(ch))
                putchar(ch);
        fclose(fp);
        return 0;
    }
    答:
    如果可能的話,它會打開名字與第一個命令行參數(shù)相同的文件,并在屏幕上顯示文件中的每個數(shù)字字符。
    3、假設(shè)在程序中有這樣一些語句:
    #include <stdio.h>
    FILE * fp1, * fp2;
    char ch;

    fp1 = fopen("terky", "r");
    fp2 = fopen("jerky", "w");
    并且,假設(shè)兩個文件都已被成功地打開了。為下面的函數(shù)調(diào)用提供缺少的參數(shù):
    a.ch = getc();
    b.fprintf(, "%c\n",);
    c.putc(,);
    d.fclose(); /* 關(guān)閉terky文件 */
    答:
    a.ch = getc(fp1);
    b.fprintf(fp2, "%c\n", ch);
    c.putc(ch, fp2);
    d.fclose(fp1); /* 關(guān)閉terky文件 */
    4、編寫一段程序。它不讀取任何命令行參數(shù)或者讀取一個命令行參數(shù)。如果有一個參數(shù),程序?qū)⑺鳛橐粋€輸入文件名。如果沒有參數(shù),使用標(biāo)準(zhǔn)輸入(stdin)作為輸入。假設(shè)輸入完全由浮點數(shù)組成。讓程序計算并且報告輸入數(shù)字的算數(shù)平均值。
    答:
    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
        int ch;
        FILE * fp;
        double n, sum = 0.0;
        int ct = 0;

        if(argc == 1)
            fp = stdin;
        else if(argc == 2)
        {
            if((fp = fopen(argv[1], "r")) == NULL)
            {
                fprintf(stderr, "Can't open %s\n", argv[1]);
                exit(EXIT_FAILURE);
            }
        }
        else
        {
            fprintf(stderr, "Usage: %s [filename]\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        while(fscanf(fp, "%lf", &n) == 1)
        {
            sum += n;
            ++ct;
        }
        if(ct > 0)
            printf("Average of %d values = %f\n", ct, sum / ct);
        else
            printf("No valid data.\n");
        fclose(fp);
        return 0;
    }
    5、編寫一段程序。它接受兩個命令行參數(shù),第一個是一個字符,第二個是一個文件名。要求程序只打印文件中包含給定字符的哪些行。
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(int argc, char *argv[])
    {
        FILE * fp;
        char input[1001];

        if(argc < 3)
        {
            fprintf(stderr, "Usage: %s filename\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        if((fp = fopen(argv[2], "r")) == NULL)
        {
            fprintf(stderr, "Can't open %s\n", argv[2]);
            exit(EXIT_FAILURE);
        }
        while(fgets(input, 256, fp) != NULL)
        {
            if(strchr(input, argv[1][0]) != NULL)
                fputs(input, stdout);
        }
        fclose(fp);
        return 0;
    }
    6、對于二進(jìn)制流而言,二進(jìn)制文件和文本文件有什么區(qū)別?對于文本流呢?
    答:(參考課后答案)
    二進(jìn)制文件和文本文件之間的不同在于這兩種文件格式對系統(tǒng)的依賴性不同。二進(jìn)制流和文本流之間的不同則包括在讀寫流時由程序執(zhí)行的轉(zhuǎn)換(二進(jìn)制流不進(jìn)行轉(zhuǎn)換,而文本流可能會轉(zhuǎn)換換行符和其他字符)。
    7、下面兩者之間的區(qū)別是什么?
    a.通過使用fprintf()和使用fwrite()保存8238201.
    b.通過使用putc()和使用fwrite()保存字符S.
    答:
    a.使用fprintf()存儲8238201時,把它作為在7個字節(jié)中的7個字符來保存;而使用fwrite()來存儲時,使用該數(shù)值的二進(jìn)制表示把它保存為一個4字節(jié)的整數(shù)。
    b.沒有不同,每種情況下都保存為一個單字節(jié)的二進(jìn)制碼。
    8、下列語句的區(qū)別是什么?
    printf("Hello, %s\n", name);
    fprintf(stdout, "Hello, %s\n", name);
    fprintf(stderr, "Hello, %s\n", name);
    答:
    第一個只是第二個的速記表示;第三個寫到標(biāo)準(zhǔn)錯誤上。通常標(biāo)準(zhǔn)錯誤被定向到與標(biāo)準(zhǔn)輸出同樣的位置,但是標(biāo)準(zhǔn)錯誤不受標(biāo)準(zhǔn)輸出重定向的影響。
    9、以"a+"、"r+"和"w+"模式打開的文件都是可讀可寫的。哪種模式更適合用來改變文件中已有的內(nèi)容?
    答:"r+"模式使您可以在文件中的任何位置讀寫,所以它是最合適的。"a+"只允許您在文件的末尾添加內(nèi)容,而"w+"給您提供一個空文件,它丟棄以前的文件內(nèi)容。
    編程練習(xí)
    1、
    #include <stdio.h>
    #include <stdlib.h>
    #define SLEN 50
    int main(void)
    {
        int ch;
        FILE * fp;
        char file[SLEN];
        long count = 0;

        puts("Enter the name of the file to be processed: ");
        gets(file);

        if((fp = fopen(file, "r")) == NULL)
        {
            fprintf(stderr, "Can't open %s\n", file);
            exit(EXIT_FAILURE);
        }
        while((ch = getc(fp)) != EOF)
        {
            putc(ch, stdout);
            count++;
        }
        fclose(fp);
        printf("File %s has %ld characters\n", file, count);
        return 0;
    }
    2、
    #include <stdio.h>
    #include <stdlib.h>
    #define SLEN 50
    int main(int argc, char *argv[])
    {
        FILE *in, *out;
        int ch;
        char file[SLEN];

        if(argc < 3)
        {
            fprintf(stderr, "Usage: %s filename\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        if((in = fopen(argv[1], "rb")) == NULL)
        {
            fprintf(stderr, "Can't open %s\n", argv[1]);
            exit(EXIT_FAILURE);
        }
        if((out = fopen(argv[2], "wb")) == NULL)
        {
            fprintf(stderr, "Can't open %s\n", argv[2]);
            exit(EXIT_FAILURE);
        }
        // 復(fù)制
        while((ch = getc(in)) != EOF)
            putc(ch, out);

        if(fclose(in) != 0 || fclose(out) != 0)
            fprintf(stderr, "Error in closing files\n");
        return 0;
    }
    3、
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #define SLEN 50
    int main(void)
    {
        FILE *in, *out;
        int ch;
        char file_source[SLEN], file_target[SLEN];

        printf("Enter the source file name and the output file name: \n");
        scanf("%s %s", file_source, file_target);
        if((in = fopen(file_source, "r")) == NULL)
        {
            fprintf(stderr, "Can't open %s\n", file_source);
            exit(EXIT_FAILURE);
        }
        if((out = fopen(file_target, "w")) == NULL)
        {
            fprintf(stderr, "Can't open %s\n", file_target);
            exit(EXIT_FAILURE);
        }
        // 復(fù)制
        while((ch = getc(in)) != EOF)
            putc(toupper(ch), out);

        if(fclose(in) != 0 || fclose(out) != 0)
            fprintf(stderr, "Error in closing files\n");
        return 0;
    }
    4、
    #include <stdio.h>
    #include <stdlib.h>
    #define SLEN 50
    int main(int argc, char *argv[])
    {
        FILE *fp;
        int ch;
        int i;

        // 命令行參數(shù)只有程序名時
        if(argc < 2)
        {
            printf("Usage: %s filename\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        // 命令行參數(shù)中有文件名時
        for(i = 1; i < argc; i++)
        {
            if((fp = fopen(argv[i], "r")) == NULL)
            {
                fprintf(stderr, "Can't open %s\n", argv[i]);
                exit(EXIT_FAILURE);
            }
            printf("-------------------------file %s content-------------------------\n", argv[i]);
            while((ch = getc(fp)) != EOF)
                putc(ch, stdout);
            putchar('\n');
            if(fclose(fp) != 0)
                fprintf(stderr, "Error in closing files\n");
        }
        return 0;
    }
    5、
    /* 把多個文件的內(nèi)容追加到一個文件中 */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define BUFSIZE 1024
    #define SLEN 81
    void append(FILE *source, FILE *dest);

    int main(int argc, char *argv[])
    {
        FILE *fa, *fs;  // fa指向追加的目的文件, fs指向源文件
        int files = 0;  // 追加文件的個數(shù)
        int i = 2;
        //char file_app[SLEN]; // 被追加文件的名稱
        
    //char file_src[SLEN]; // 源文件的名稱
        
    //puts("Enter name of destination file: ");
        
    //gets(file_app);
        
    // "a":打開一個文本文件,可以寫入文件,向已有文件的尾部追加內(nèi)容,如果
        
    // 該文件不存在則先創(chuàng)建之
        if((fa = fopen(argv[1], "a")) == NULL)
        {
            fprintf(stderr, "Can't open %s\n", argv[1]);
            exit(2);
        }
        /*
          創(chuàng)建一個輸出緩沖區(qū)
          NULL---函數(shù)會自動為自己分配一個緩沖區(qū);
          BUFSIZE---其大小為1024byte;
          _IOFBF---完全緩沖(緩沖區(qū)滿的時候刷新)
        
    */
        if(setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0)
        {
            fputs("Can't create output buffer\n", stderr);
            exit(3);
        }
        //puts("Enter name of first source file (empty line to quit): ");
        while(i < argc)
        {
            if(strcmp(argv[i], argv[1]) == 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
            {
                /*
                  創(chuàng)建一個輸入緩沖區(qū)
                  NULL---函數(shù)會自動為自己分配一個緩沖區(qū);
                  BUFSIZE---其大小為1024byte;
                  _IOFBF---完全緩沖(緩沖區(qū)滿的時候刷新)
                
    */
                if(setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)
                {
                    fputs("Can't create input buffer\n", stderr);
                    continue;
                }
                append(fs, fa);
                // 發(fā)生讀取錯誤
                if(ferror(fs) != 0)
                    fprintf(stderr, "Error in reading file %s.\n", argv[i]);
                // 發(fā)生寫入錯誤
                if(ferror(fa) != 0)
                    fprintf(stderr, "Error in writing file %s.\n", argv[1]);
                fclose(fs);
                files++;
                printf("File %s appended.\n", argv[i]);
                i++;
            }
        }
        printf("Done. %d files appended.\n", files);
        fclose(fa);

        return 0;
    }
    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);
    }
    我覺得沒必要用循環(huán)吧!使用命令行參數(shù)不像交互式界面一樣可以用循環(huán)表達(dá)的那么清楚, 這是我的第二次修改:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define BUFSIZE 1024
    #define SLEN 81
    void append(FILE *source, FILE *dest);

    int main(int argc, char *argv[])
    {
        FILE *fa, *fs;
        int files = 0;

        if(argc != 3)
        {
            printf("Usage: %s filename filename\n", argv[0]);
            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);
        }

        if(strcmp(argv[1], argv[2]) == 0)
        {
            fputs("Can't append file to itself\n", stderr);
            exit(EXIT_FAILURE);
        }
        else if((fs = fopen(argv[2], "r")) == NULL)
        {
            fprintf(stderr, "Can't open %s\n", argv[2]);
            exit(EXIT_FAILURE);
        }
        else
        {
            if(setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)
            {
                fputs("Can't create input buffer\n", stderr);
                exit(EXIT_FAILURE);
            }
            append(fs, fa);
            if(ferror(fs) != 0)
                fprintf(stderr, "Error in reading file %s.\n", argv[2]);
            if(ferror(fa) != 0)
                fprintf(stderr, "Error in writing file %s.\n", argv[1]);
            fclose(fs);
            files++;
            printf("File %s appended.\n", argv[2]);
        }
        printf("Done. %d files appended.\n", files);
        fclose(fa);
        return 0;
    }
    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);
    }

    6、
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LEN 40

    int main(void)
    {
        FILE *in, *out;
        int ch;
        char name1[LEN];
        char name2[LEN];
        int count = 0;

        puts("Enter the name of the file to be processed: ");
        gets(name1);

        if((in = fopen(name1, "r")) == NULL)
        {
            fprintf(stderr, "I couldn't open the file \"%s\"\n", name1);
            exit(2);
        }
        strcpy(name2, name1);
        strcat(name2, ".red");
        if((out = fopen(name2, "w")) == NULL)
        {
            fprintf(stderr, "Can't create output file.\n");
            exit(3);
        }
        while((ch = getc(in)) != EOF)
            if(count++ % 3 == 0)
                putc(ch, out);   // 打印每3個字符中的1個
        if(fclose(in) != 0 || fclose(out) != 0)
            fprintf(stderr, "Error in closing files.\n");
        return 0;
    }
    聲明兩個字符數(shù)組,沒必要!
    經(jīng)過第二次修改如下:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LEN 40

    int main(void)
    {
        FILE *in, *out;
        int ch;
        char name[LEN];
        int count = 0;

        puts("請您輸入要讀取的文件名:");
        gets(name);
        if((in = fopen(name, "r")) == NULL)
        {
            fprintf(stderr, "I couldn't open the file \"%s\"\n", name);
            exit(EXIT_FAILURE);
        }
        strcat(name, ".red");
        if((out = fopen(name, "w")) == NULL)
        {
            fprintf(stderr, "Can't create output file.\n");
            exit(EXIT_FAILURE);
        }
        while((ch = getc(in)) != EOF)
            if(count++ % 3 == 0)
                putc(ch, out);
        if(fclose(in) != 0 || fclose(out) != 0)
            fprintf(stderr, "Error in closing files\n");
        return 0;
    }

    7、(參考http://xiongyi85.blog.51cto.com
    //pe13-7a
    #include <stdio.h>
    #include <stdlib.h>
    #define SIZE 256
    int main(int argc, char *argv[])
    {
        FILE *fp1, *fp2;
        char ch1, ch2;

        if(argc < 3)
        {
            fprintf(stderr, "Usage: %s filename\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        if((fp1 = fopen(argv[1], "r")) == NULL)
        {
            fprintf(stderr, "I couldn't open the file \"%s\"\n", argv[1]);
            exit(1);
        }
        if((fp2 = fopen(argv[2], "r")) == NULL)
        {
            fprintf(stderr, "I couldn't open the file \"%s\"\n", argv[2]);
            exit(2);
        }
        // 不應(yīng)該用fgets()/fputs()函數(shù)
        ch1 = fgetc(fp1);
        ch2 = fgetc(fp2);
        while(ch1 != EOF || ch2 != EOF)
        {
            if(ch1 == EOF || ch2 == EOF)
                putchar('\n');
            while(ch1 != EOF && ch1 != '\n')
            {
                putchar(ch1);
                ch1 = fgetc(fp1);
            }
            if(ch1 != EOF)
            {
                putchar('\n');
                ch1 = fgetc(fp1);
            }
            while(ch2 != EOF && ch2 != '\n')
            {
                putchar(ch2);
                ch2 = fgetc(fp2);
            }
            if(ch2 != EOF)
            {
                putchar('\n');
                ch2 = fgetc(fp2);
            }
        }
        /*while(fgets(line1, SIZE, fp1) != NULL || fgets(line2, SIZE, fp2) != NULL)
        {
            while(*line1 != '\n')
                putchar(*line1++);
            putchar('\n');
            while(*line2 != '\n')
                putchar(*line2++);
        }
    */
        if(fclose(fp1) != 0 || fclose(fp2) != 0)
            fprintf(stderr, "Error in closing files.\n");
        return 0;
    }
    //pe13-7b
    #include <stdio.h>
    #include <stdlib.h>
    #define SIZE 256
    int main(int argc, char *argv[])
    {
        FILE *fp1, *fp2;
        char ch1, ch2;

        if(argc < 3)
        {
            fprintf(stderr, "Usage: %s filename\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        if((fp1 = fopen(argv[1], "r")) == NULL)
        {
            fprintf(stderr, "I couldn't open the file \"%s\"\n", argv[1]);
            exit(1);
        }
        if((fp2 = fopen(argv[2], "r")) == NULL)
        {
            fprintf(stderr, "I couldn't open the file \"%s\"\n", argv[2]);
            exit(2);
        }
        // 不應(yīng)該用fgets()/fputs()函數(shù)
        ch1 = fgetc(fp1);
        ch2 = fgetc(fp2);
        while(ch1 != EOF || ch2 != EOF)
        {
            if(ch1 == EOF || ch2 == EOF)
                putchar('\n');
            while(ch1 != EOF && ch1 != '\n')
            {
                putchar(ch1);
                ch1 = fgetc(fp1);
            }
            // 不打印換行符,改為打印一個空格
            if(ch1 != EOF)
            {
                putchar(' ');
                ch1 = fgetc(fp1);
            }
            while(ch2 != EOF && ch2 != '\n')
            {
                putchar(ch2);
                ch2 = fgetc(fp2);
            }
            if(ch2 != EOF)
            {
                putchar('\n');
                ch2 = fgetc(fp2);
            }
        }
        if(fclose(fp1) != 0 || fclose(fp2) != 0)
            fprintf(stderr, "Error in closing files.\n");
        return 0;
    }
    8、
    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
        FILE *fp;
        char ch;
        int i, count = 0;

        if(argc == 2)
            fp = stdin;
        else
        {
            for(i = 2; i < argc; i++)
            {
                if((fp = fopen(argv[i], "r")) == NULL)
                {
                    fprintf(stderr, "I couldn't open the file \"%s\"\n", argv[i]);
                    exit(1);
                }
                while((ch = fgetc(fp)) != EOF)
                    if(argv[1][0] == ch)
                        count++;
                if(fclose(fp) != 0)
                    fprintf(stderr, "Error in closing files.\n");
                printf("The number of characters %c in file %s: %d\n", argv[1][0], argv[i], count);

            }
        }
        return 0;
    }
    沒有fgetc()函數(shù),只有fgets()函數(shù),注意區(qū)分getc()、fgets()函數(shù)!!!
    經(jīng)第二次修改如下:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LEN 40

    int main(int argc, char *argv[])
    {
        int ch;
        int count = 0;
        FILE *fp;

        if(argc < 2)
        {
            fprintf(stderr, "Usage: %s char(or filename): \n", argv[0]);
            exit(EXIT_FAILURE);
        }
        if(argc == 2)
        {
            printf("請您輸入一些字符:\n");
            while((ch = getchar()) != '\n')
            {
                if(ch == argv[1][0])
                    count++;
            }
            printf("字符%c出現(xiàn)的次數(shù)為:%d\n", argv[1][0], count);
        }
        else
        {
            for(int i = 2; i < argc; i++)
            {
                count = 0;
                if((fp = fopen(argv[i], "r")) == NULL)
                {
                    fprintf(stderr, "Can't open the file %s.\n", argv[i]);
                    exit(EXIT_FAILURE);
                }
                while((ch = getc(fp)) != EOF)
                {
                    if(ch == argv[1][0])
                        count++;
                }
                if(fclose(fp) != 0)
                    printf("Error in closing files.\n");
                printf("字符%c在文件%s中出現(xiàn)的次數(shù)為:%d\n", argv[1][0], argv[i], count);
            }
        }

        return 0;
    }

    9、(媽的,理解錯題意了,我還以為是在一個已經(jīng)存在的文件繼續(xù)追加單詞,我說怎么列表順序不是從1開始的,浪費太多時間了!參考,http://ptgmedia.pearsoncmg.com/images/9780321928429/downloads/9780321928429_ProgrammingExerciseAnswers_Selected.pdf)注意審題!!!
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 40
    int main(void)
    {
        FILE *fp;
        char words[MAX];
        int word_count = 0;

        if((fp = fopen("wordy", "a+")) == NULL)
        {
            fprintf(stdout, "Can't open \"wordy\" file.\n");
            exit(1);
        }
        /* 確定文件當(dāng)前行數(shù) */
        rewind(fp);  // 使程序回到文件開始處
        while((fgets(words, MAX, fp)) != NULL)
            word_count++;
        rewind(fp);  // 使程序回到文件開始處
        puts("Enter words to add to the file; press the Enter");
        puts("key at the beginning of a line to terminate.");
        while(gets(words) != NULL && words[0] != '\0')
            fprintf(fp, "%d:%s\n", ++word_count, words);
        puts("File contents: ");
        rewind(fp);
        while(fgets(words, MAX, fp) != NULL)
            fputs(words, stdout);
        if(fclose(fp) != 0)
            fprintf(stderr, "Error closing file\n");
        return 0;
    }
    10、(做的想吐血,我真是受不了了!!!為什么我寫的就不對呢?借鑒http://xiongyi85.blog.51cto.com做法)
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #define MAX 40
    int main(void)
    {
        FILE *fp;
        char file[MAX];
        long location, last;
        char ch;

        puts("Enter the name of the file to be processed: ");
        gets(file);
        // 以文本模式打開文件
        if((fp = fopen(file, "r")) == NULL)
        {
            printf("reverse can't open %s\n", file);
            exit(EXIT_FAILURE);
        }
        fseek(fp, 0L, SEEK_END);
        last = ftell(fp);
        printf("Please enter a file location (q to quit): \n");
        while(scanf("%ld", &location) == 1)
        {
            if(location < last && location > 0)
            {
                fseek(fp, location - 1, SEEK_SET);  // 找到文件的第location個字節(jié)處
                while((ch = fgetc(fp)) != '\n')  // 適用范圍:只是對于第一行有效,而不能擴(kuò)展至任意行
                    putchar(ch);
                putchar('\n');
            }
            else
                printf("out of range!\n");
            printf("Please enter a file location (q to quit): \n");
        }

        // 為什么不能像下面這樣寫呢???
        /*fseek(fp, location, SEEK_SET);  // 找到文件的第location個字節(jié)處
        for(count = 0L; count < last; count++)
        {
            fseek(fp, count, SEEK_CUR);
            ch = getc(fp);
            if(ch != '\n')
                putchar(ch);
        }
    */
        if(fclose(fp) != 0)
            fprintf(stderr, "Error closing file\n");
        return 0;
    }
    11、
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define SIZE 40
    int main(int argc, char *argv[])
    {
        FILE *fp;
        char line[SIZE];

        if(argc < 3)
        {
            fprintf(stderr, "Usage: %s string filename\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        if((fp = fopen(argv[2], "r")) == NULL)
        {
            fprintf(stderr, "Can't open the file \"%s\"\n", argv[2]);
            exit(EXIT_FAILURE);
        }
        while(fgets(line, SIZE, fp) != NULL)
            if(strstr(line, argv[1]) != NULL)
                fputs(line, stdout);
        if(fclose(fp) != 0)
            fprintf(stderr, "Error closing file\n");
        return 0;
    }
    12、(實在做不出來,遂參考http://ptgmedia.pearsoncmg.com/images/9780321928429/downloads/9780321928429_ProgrammingExerciseAnswers_Selected.pdf)
    #include <stdio.h>
    #include <stdlib.h>
    #define ROWS 20
    #define COLS 30
    #define LEVELS 10
    const char trans[LEVELS + 1] = " .':~*=&%@";
    // 初始化字符數(shù)組
    void init(char arr[][COLS], char ch); // arr指向一個包含30個字符的數(shù)組
    void makePic(char pic[][COLS], int data[][COLS], int row);
    int main(void)
    {
        int row, col;
        FILE *fp;
        char ch[ROWS][COLS];   // 創(chuàng)建一個20*30的字符數(shù)組
        int image[ROWS][COLS];

        if((fp = fopen("wordy", "r")) == NULL)
        {
            fprintf(stderr, "Can't open the file \"wordy\"\n");
            exit(EXIT_FAILURE);
        }
        // 將文件的內(nèi)容讀入到一個20*30的int數(shù)組中
        for(row = 0; row < ROWS; row++)
            for(col = 0; col < COLS; col++)
                fscanf(fp, "%d", &image[row][col]); // scanf()函數(shù)忽略空格和換行符
        
    // 如果發(fā)生讀取錯誤
        if(ferror(fp) != 0)
        {
            fprintf(stderr, "Error in reading file wordy.\n");
            exit(EXIT_FAILURE);
        }
        makePic(ch, image, ROWS);
        // 向屏幕輸出圖片
        for(row = 0; row < ROWS; row++)
        {
            for(col = 0; col < COLS; col++)
                putchar(ch[row][col]);
            putchar('\n');
        }
        if(fclose(fp) != 0)
            fprintf(stderr, "Error closing file\n");
        return 0;
    }
    void init(char arr[][COLS], char ch)
    {
        int r, c;
        for(r = 0; r < ROWS; r++)
            for(c = 0; c < COLS; c++)
                arr[r][c] = ch;
    }
    //將data數(shù)組的值轉(zhuǎn)換成trans中的符號后錄入pic
    void makePic(char pic[][COLS], int data[][COLS], int row)
    {
        int r, c;
        for(r = 0; r < row; r++)
            for(c = 0; c < COLS; c++)
                pic[r][c] = trans[data[r][c]]; // 驚呆小伙伴了!!!
    }
    我的文件:


    運(yùn)行結(jié)果:

    13、(參考 csdn---vs9841前輩的做法,但做的方法太笨了,應(yīng)該還有簡便方法的,不用考慮這9種情況的!因為太繁瑣了!)
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <stdbool.h>
    #define ROWS 20
    #define COLS 30
    #define LEVELS 10
    const char trans[LEVELS + 1] = " .':~*=&%@";
    // 初始化字符數(shù)組
    void init(char arr[][COLS], char ch); // arr指向一個包含30個字符的數(shù)組
    // 消除尖峰脈沖
    void eliminate(int row, int col, int data[][COLS]);
    // 判斷該值與它周圍每個值的差都是否大于1
    bool check(int n, int te[n]);
    void makePic(char pic[][COLS], int data[][COLS], int row);

    int main(void)
    {
        int row, col;
        FILE *fp;
        char ch[ROWS][COLS];   // 創(chuàng)建一個20*30的字符數(shù)組
        int image[ROWS][COLS];


        if((fp = fopen("wordy", "r")) == NULL)
        {
            fprintf(stderr, "Can't open the file \"wordy\"\n");
            exit(EXIT_FAILURE);
        }
        // 將文件的內(nèi)容讀入到一個20*30的int數(shù)組中
        for(row = 0; row < ROWS; row++)
            for(col = 0; col < COLS; col++)
                fscanf(fp, "%d", &image[row][col]); // scanf()函數(shù)忽略空格和換行符
        
    // 如果發(fā)生讀取錯誤
        if(ferror(fp) != 0)
        {
            fprintf(stderr, "Error in reading file wordy.\n");
            exit(EXIT_FAILURE);
        }
        eliminate(ROWS, COLS, image);
        makePic(ch, image, ROWS);
        // 向屏幕輸出圖片
        for(row = 0; row < ROWS; row++)
        {
            for(col = 0; col < COLS; col++)
                putchar(ch[row][col]);
            putchar('\n');
        }
        if(fclose(fp) != 0)
            fprintf(stderr, "Error closing file\n");
        return 0;
    }
    void init(char arr[][COLS], char ch)
    {
        int r, c;
        for(r = 0; r < ROWS; r++)
            for(c = 0; c < COLS; c++)
                arr[r][c] = ch;
    }
    void eliminate(int row, int col, int data[][COLS])
    {
        int r, c;
        int temp[4] = {[1] = 0}; // 存放與上下左右相減的絕對值

        for(r = 0; r < row; r++)
            for(c = 0; c < col; c++)
            {
                if(r == 0)
                {
                    if(c == 0) // 矩陣的左上角
                    {
                        temp[0] = abs(data[r][c] - data[r+1][c]);
                        temp[1] = abs(data[r][c] - data[r][c+1]);
                        if(check(2, temp))
                            data[r][c] = (data[r+1][c] + data[r][c+1]) / 2;
                    }
                    else if(c == col - 1)  // 矩陣的右上角
                    {
                        temp[0] = abs(data[r][c] - data[r][c-1]);
                        temp[1] = abs(data[r][c] - data[r+1][c]);
                        if(check(2, temp))
                            data[r][c] = (data[r][c-1] + data[r+1][c]) / 2;
                    }
                    else  // 矩陣的上邊
                    {
                        temp[0] = abs(data[r][c] - data[r][c-1]);
                        temp[1] = abs(data[r][c] - data[r][c+1]);
                        temp[2] = abs(data[r][c] - data[r+1][c]);
                        if(check(3, temp))
                            data[r][c] = (data[r][c-1] + data[r][c+1] + data[r+1][c]) / 3;
                    }
                }
                else if(r == row - 1)
                {
                    if(c == 0) // 矩陣的左下角
                    {
                        temp[0] = abs(data[r][c] - data[r-1][c]);
                        temp[1] = abs(data[r][c] - data[r][c+1]);
                        if(check(2, temp))
                            data[r][c] = (data[r-1][c] + data[r][c+1]) / 2;
                    }
                    else if(c == col - 1) // 矩陣的右下角
                    {
                        temp[0] = abs(data[r][c] - data[r-1][c]);
                        temp[1] = abs(data[r][c] - data[r][c-1]);
                        if(check(2, temp))
                            data[r][c] = (data[r-1][c] + data[r][c-1]) / 2;
                    }
                    else // 矩陣的下邊
                    {
                        temp[0] = abs(data[r][c] - data[r-1][c]);
                        temp[1] = abs(data[r][c] - data[r][c-1]);
                        temp[2] = abs(data[r][c] - data[r][c+1]);
                        if(check(3, temp))
                            data[r][c] = (data[r-1][c] + data[r][c-1] + data[r][c+1]) / 3;
                    }
                }
                else if(c == 0) // 矩陣的左邊
                {
                    temp[0] = abs(data[r][c] - data[r-1][c]);
                    temp[1] = abs(data[r][c] - data[r][c+1]);
                    temp[2] = abs(data[r][c] - data[r+1][c]);
                    if(check(3, temp))
                        data[r][c] = (data[r-1][c] + data[r][c+1] + data[r+1][c]) / 3;
                }
                else if(c == col - 1) // 矩陣的右邊
                {
                    temp[0] = abs(data[r][c] - data[r-1][c]);
                    temp[1] = abs(data[r][c] - data[r][c-1]);
                    temp[2] = abs(data[r][c] - data[r+1][c]);
                    if(check(3, temp))
                        data[r][c] = (data[r-1][c] + data[r][c-1] + data[r+1][c]) / 3;
                }
                else  // 矩陣的內(nèi)部
                {
                    temp[0] = abs(data[r][c] - data[r-1][c]);
                    temp[1] = abs(data[r][c] - data[r][c-1]);
                    temp[2] = abs(data[r][c] - data[r+1][c]);
                    temp[3] = abs(data[r][c] - data[r][c+1]);
                    if(check(4, temp))
                        data[r][c] = (data[r-1][c] + data[r][c-1] + data[r+1][c] + data[r][c+1]) / 4;
                }
            }
    }
    bool check(int n, int te[])
    {
        int i;
        for(i = 0; i < n; i++)
            if(te[i] <= 1)
                return false;
        return true;
    }
    //將data數(shù)組的值轉(zhuǎn)換成trans中的符號后錄入pic
    void makePic(char pic[][COLS], int data[][COLS], int row)
    {
        int r, c;
        for(r = 0; r < row; r++)
            for(c = 0; c < COLS; c++)
                pic[r][c] = trans[data[r][c]]; // 驚呆小伙伴了!!!
    }
    我的文件:

    運(yùn)行結(jié)果為:

    至此,終于完成這章編程練習(xí),真是不容易!!!
    posted on 2015-12-07 12:02 李阿昀 閱讀(1060) 評論(0)  編輯  收藏 所屬分類: C Primer Plus 復(fù)習(xí)題與編程練習(xí)
    主站蜘蛛池模板: 色多多A级毛片免费看| 亚洲女同成人AⅤ人片在线观看| 一区二区三区免费电影| 亚洲一区二区三区不卡在线播放| 亚洲gv白嫩小受在线观看| 国产成人无码a区在线观看视频免费| 99爱在线观看免费完整版| 精品久久久久久无码免费| 国产AV日韩A∨亚洲AV电影| 最新亚洲精品国偷自产在线| 亚洲日本一区二区| 亚洲中文字幕无码日韩| 亚洲av无码成人精品区在线播放| 四色在线精品免费观看| 日本在线高清免费爱做网站| 久久久久高潮毛片免费全部播放 | a级毛片免费全部播放无码| 猫咪免费人成网站在线观看入口| 一区二区亚洲精品精华液| 亚洲国产成人超福利久久精品| 久久久久亚洲AV片无码| 亚洲精品无码成人片久久| 久久影视综合亚洲| 亚洲视频在线免费| 亚洲无码黄色网址| 久久亚洲精品无码观看不卡| 亚洲第一区精品观看| 免费大香伊蕉在人线国产| 午夜精品在线免费观看| 日本成人在线免费观看| 永久免费bbbbbb视频| 日本不卡免费新一二三区| 国产精品视_精品国产免费| 卡1卡2卡3卡4卡5免费视频| 曰皮全部过程视频免费国产30分钟 | 中文字幕在线免费| 91福利免费体验区观看区| 亚洲一级免费视频| 一二三四免费观看在线电影| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲w码欧洲s码免费|