我有两个C文件,一个是名为"function.c
";另一个是标题为"main.c
"。我正在尝试打开一个由用户作为命令行参数输入的文本文件,如下所示。
./program file.txt
程序然后使用"file.txt"我的main.c
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *readFile(char *filename);
int main(int arg_count, char *arg[]) {
FILE *fptr = fopen(arg[1] ,"r");
if(fptr == NULL) {
printf("Error! opening file");
exit(1);
}
readFile(arg[1]);
return 0;
}
main函数调用另一个c文件中的函数"readFile,"在"function.c,">
char *readFile(char *filename) {
fgets(arg[1], sizeof(arg[1]), stdin);
剩余代码
return 0;
}
我想对文件做什么,将写入function.c
内部(在readFile函数中)。当我试着编译它时,它给了我一个错误,说"error: ' arg '未声明,';但是当我试图声明它时,它给了我另一个错误。注意,我将这两个文件连同一个包含函数原型的头文件一起编译。如何使从命令行输入的内容延续到function.c
文件中,以便我可以使用该文件?
函数的参数只存在于该函数的作用域中。char *arg[]
不存在于函数readFile
的作用域中,即使这两个函数在同一个源文件中。
readFile
在参数filename
中获得指向arg[1]
的指针;在readFile
中使用
建议代码::
- 干净地编制
- 执行所需的功能
- 正确检查错误(除了调用
fgets()
) - 说明为什么每个头文件都包含
- 正确验证是否存在期望的命令行参数
- 使用动态内存将字符串传递回调用者
- 在自己之后清理(fclose()和free())
- 使用'include'保护来防止多次包含头文件
- 将任何错误消息插入
stderr
以通知用户任何问题 - 使用
#define
给"魔法"数字(20)一个有意义的名字
现在,建议的代码:
// myHeader.h
#ifndef MY_HEADER_H
#define MY_HEADER_H
char *readFile(char *filename);
#endif // MY_HEADER_H
// main.c
#include <stdio.h> // fprintf()
#include <stdlib.h> // exit(), EXIT_FAILURE, free()
#include "myHeader.h"
int main(int arg_count, char *arg[])
{
if( arg_count <= 1 )
{
fprintf( stderr, "USAGE: %s inputFileNamen", arg[0] );
exit( EXIT_FAILURE );
}
// implied else, command line parameter was entered by user
char *buffer = readFile(arg[1]);
printf( "%s]n", buffer );
free( buffer );
return 0;
}
// function.c
#include <stdio.h> // fopen(), fclose(), perror(), fgets()
#include <stdlib.h> // exit(), EXIT_FAILURE, malloc()
#include "myHeader.h"
#define MAX_BUF_LEN 20
char *readFile( char *filename )
{
FILE *fptr = fopen( filename , "r" );
if( fptr == NULL )
{
perror( "fopen failed" );
exit( EXIT_FAILURE );
}
//implied else, fopen successful
// read first line from file
char *buffer = malloc( MAX_BUF_LEN );
if( buffer == NULL )
{
perror( "malloc failed" );
exit( EXIT_FAILURE );
}
// implied else, malloc successful
fgets( buffer, sizeof(buffer), fptr );
fclose( fptr );
return buffer;
}