如何读取文件并在 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 添加到元素。
我是计算机科学专业的一名大四学生,即将进入我的最后一个学期,在那里我将只学习一门 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 添加到元素。