从命令行参数打开文本文件?



我有两个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中使用

建议代码::

  1. 干净地编制
  2. 执行所需的功能
  3. 正确检查错误(除了调用fgets())
  4. 说明为什么每个头文件都包含
  5. 正确验证是否存在期望的命令行参数
  6. 使用动态内存将字符串传递回调用者
  7. 在自己之后清理(fclose()和free())
  8. 使用'include'保护来防止多次包含头文件
  9. 将任何错误消息插入stderr以通知用户任何问题
  10. 使用#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;
}

最新更新