如何读取文件并在 C 中使用 getc?

How to read a file and use getc in C?

我是计算机科学专业的一名大四学生,即将进入我的最后一个学期,在那里我将只学习一门 class 仅涉及 C 语言。我试图通过制作一个相当简单的程序来练习我的技能我设想的。我只是想读取一个文件,将其全部内容放入一个数组中,然后遍历该数组以查找拼写为 "Waldo" 的字符序列。换句话说,一种 Where's Waldo?程序。

我还没有开始使用数组编写 "Waldo" 搜索,相反,我只是想测试我对 getc() 函数的使用并输出输入文件的内容,但是使用到目前为止的源代码,我只收到看似乱码的错误输出(可能与我错误地使用 getc() return 值的方式有关)。

也许我不应该使用 getc() 而应该使用 scanf() 类型的函数?此外,在此处插入和打印数组时,我非常想掌握按引用指针表示法,因此我想避免使用括号表示法(按值)引用数组元素。诚然,我对指针的理解可能不是最完整的。

#include <stdio.h>
#include <stdlib.h>

void main( int argc, char *argv[] )
{

    FILE *filePointer;
    int filechar, i; 
    char input_file_array[512];
    char *arrayPointer = input_file_array;
    filePointer = fopen( argv[1], "r" );

    if ( argc > 2 || ( filePointer = fopen( argv[1], "r" ) ) == NULL )
    {
        printf( "\nIncorrect usage, please say...\nRunWaldo *filename*\n\n" );
        exit( 1 );
    }

    if ( filePointer != NULL )
    {    
        while ( !feof( filePointer ) )
        {
            *arrayPointer = getc( filePointer );
            arrayPointer++;
        }

    for ( i = 0; i < 512; i++ )
    {
        printf( "%c", *(arrayPointer + i) );
    }

    printf("\n");

}

您代码中的主要问题实际上是您如何打印出 input_file_array。假设您正在从文件中读取 10 个字符。 arrayPointer 现在从 input_file_array 的原始位置偏移了 10。之后,您不会将 arrayPointer 重置回 input_file_array[0]

所以它从 input_file_array[10] 开始打印。当您输出 input_file_array[512+10] 时会出现更大的问题,因为您已经正式越界并且会发生一些奇怪的事情。你应该做的是:

#include <stdio.h>
#include <stdlib.h>

void main( int argc, char *argv[] )
{

    FILE *filePointer;
    int filechar, i; 
    char input_file_array[512];
    char *arrayPointer = input_file_array;
    filePointer = fopen( argv[1], "r" );

    if ( argc > 2 || ( filePointer = fopen( argv[1], "r" ) ) == NULL )
    {
        printf( "\nIncorrect usage, please say...\nRunWaldo *filename*\n\n" );
        exit( 1 );
    }

    if ( filePointer != NULL )
    {    
        while ( !feof( filePointer ) )
        {
            *arrayPointer = getc( filePointer );
            arrayPointer++;
        }
    }

    arrayPointer = input_file_array; // or you can just output input_file_array[i] instead
    for ( i = 0; i < 512; i++ )
    {
        printf( "%c", *(arrayPointer + i) );
    }

    printf("\n");

}

这是OG发布的第二个问题。在输出末尾出现垃圾的原因是 input_file_array 的最后一个字符不是 0(NULL 值)。这发生在两种情况下:

一个是编译器(我不确定为什么)允许在输入数组后泄漏一些垃圾值。我建议 input_file_array 大小为 513,input_file_array[512 ] 始终等于 0。这样,您就永远不需要处理垃圾。

另一种情况是因为您的数组当前未初始化。如果你读取的字符少于 512 个,其余的仍然是随机值,输出时显示为垃圾。字符串的一个好的经验法则是在开始时将数组 memset 为 0。另一种方法是在您上次阅读后将 0 添加到元素。