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

如何在C中读取文件并使用getc?,c,file,pointers,scanf,getc,C,File,Pointers,Scanf,Getc,我是一名即将进入最后一个学期的理工科大四学生,只上一门C语言课。我试图通过制作一个我构思的相当简单的程序来练习我的技能。我只想读取一个文件,将其全部内容放入一个数组,然后遍历该数组,查找拼写为“Waldo”的字符序列。换句话说,沃尔多在哪里?节目 我还没有开始用数组编写“Waldo”搜索代码,但我只是想测试一下我对getc()函数的使用,并输出输入文件的内容,但是用我目前掌握的源代码,我只收到了看似胡言乱语的不正确输出(可能与我错误地使用getc()返回值有关) 也许我不应该使用getc(),而

我是一名即将进入最后一个学期的理工科大四学生,只上一门C语言课。我试图通过制作一个我构思的相当简单的程序来练习我的技能。我只想读取一个文件,将其全部内容放入一个数组,然后遍历该数组,查找拼写为
“Waldo”
的字符序列。换句话说,沃尔多在哪里?节目

我还没有开始用数组编写“Waldo”搜索代码,但我只是想测试一下我对
getc()
函数的使用,并输出输入文件的内容,但是用我目前掌握的源代码,我只收到了看似胡言乱语的不正确输出(可能与我错误地使用
getc()
返回值有关)

也许我不应该使用
getc()
,而应该使用
scanf()
type函数?此外,在插入和打印数组时,我非常努力地掌握按引用指针表示法,因此我希望避免使用括号表示法(按值)引用数组元素.诚然,我可能对指针没有最全面的理解

#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");

}
#包括
#包括
void main(int argc,char*argv[])
{
文件*文件指针;
int filechar,i;
字符输入_文件_数组[512];
char*arrayPointer=输入\文件\数组;
filePointer=fopen(argv[1],“r”);
如果(argc>2 | |(filePointer=fopen(argv[1],“r”))==NULL)
{
printf(“\n用法不正确,请说…\nRunWaldo*文件名*\n\n”);
出口(1);
}
if(filePointer!=NULL)
{    
而(!feof(filePointer))
{
*arrayPointer=getc(filePointer);
arrayPointer++;
}
对于(i=0;i<512;i++)
{
printf(“%c”,*(数组指针+i));
}
printf(“\n”);
}

代码中的主要问题实际上是如何打印出
输入文件数组
。想象一下,您正在从文件中读取10个字符。
数组指针
现在从
输入文件数组
的原始位置偏移了10。之后,您不会将
数组指针
重置回
输入文件_数组[0]

因此,它从
input\u file\u array[10]
开始打印。当您输出
input\u file\u 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");

}
#包括
#包括
void main(int argc,char*argv[])
{
文件*文件指针;
int filechar,i;
字符输入_文件_数组[512];
char*arrayPointer=输入\文件\数组;
filePointer=fopen(argv[1],“r”);
如果(argc>2 | |(filePointer=fopen(argv[1],“r”))==NULL)
{
printf(“\n用法不正确,请说…\nRunWaldo*文件名*\n\n”);
出口(1);
}
if(filePointer!=NULL)
{    
而(!feof(filePointer))
{
*arrayPointer=getc(filePointer);
arrayPointer++;
}
}
arrayPointer=input\u file\u array;//或者您可以只输出input\u file\u array[i]
对于(i=0;i<512;i++)
{
printf(“%c”,*(数组指针+i));
}
printf(“\n”);
}

这是第二个问题。在输出末尾出现垃圾的原因是因为输入文件数组的最后一个字符不是0(空值)。这在两种情况下发生:

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


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

当您使用调试程序时,您看到了什么?打印时,您需要将arrayPointer重置为缓冲区的开始位置。另外,请注意,您打开文件两次,还应该检查
getc
EOF
的返回值,而不是使用
feof
。请参阅:还有一些明确的改进/优化你可能想这样做。但是,由于你仍在学习该语言,以后再担心它。当你处理字符、内存和数组时,特别容易在没有意识到的情况下越界,因为C不会警告你(与其他语言不同)。比如在(!feof)时不打开文件两次
(filePointer))
-->嗨,爆米花我真的很感谢你给我的建议。我继续做了一些修改,使它看起来像这样。。。