如何用C语言读取文件并使用getc?

问题描述 投票:0回答:1

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

我还没有对 "Waldo "搜索的数组进行编码,但我只是想测试一下我在使用 getc() 函数并输出输入文件的内容,但到目前为止,我所拥有的源代码,只接收到一些看似胡言乱语的错误输出(可能与我错误地利用了 getc() 返回值)。)

也许我不应该使用 getc() 而不是使用 scanf() 类型的函数? 另外,我非常想在这里插入数组并打印出数组时掌握by-reference指针符号,所以我希望避免使用括号符号(by-value)来引用数组元素。 诚然如此,我对指针的理解可能不是最全面的。

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

}

Here is the output...

c file pointers scanf getc
1个回答
1
投票

你的代码中主要的问题其实是你如何打印出来的。input_file_array. 想象一下,你从文件中读取10个字符。arrayPointer 的原始位置偏移了10个字符。input_file_array. 之后,你不重置 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");

}

0
投票

这是对OG发布的第二个问题的回答. 为什么你在输出的最后得到垃圾,是因为你的input_file_array的最后一个字符不是0(NULL值)。这种情况发生在两种情况下。

一种是编译器(我不知道为什么)允许输入数组后的一些垃圾值泄漏进来。我建议让 input_file_array 的大小为 513,而 input_file_array[512] 总是等于 0,这样你就不需要处理垃圾值了。

另一种情况是因为你的数组目前还没有被初始化。如果你读取的字符数少于512个,那么剩下的还是随机值,在输出时就会显示为垃圾。对于字符串来说,一个好的经验法则是在开始的时候将数组的memset为0。另一种方法是在最后一次读取后将0加到元素上。

© www.soinside.com 2019 - 2024. All rights reserved.