首页 > 解决方案 > 如何在 C 中将文本文件作为命令行参数

问题描述

基本上,我试图接受一个命令行文本文件,这样当我将程序作为“程序指令.txt”运行时,它会存储指令中列出的值。但是我无法测试我目前拥有的东西,因为它给了我错误“分段错误核心转储”。

int main(int argc, char* argv[]) {
    setup_screen();
    setup();

    // File input
    char textExtracted[250];
    FILE* file_handle;
    file_handle = fopen(argv[1], "r");
    while(!feof(file_handle)){
        fgets(textExtracted, 150, file_handle);
    }

    fclose(file_handle);

    printf("%s", textExtracted[0]);

    return 0;   
}

文本文件里面是

A 1 2 3 4 5
B 0 0
C 1 1

我只是想将每一行存储在一个数组中,然后打印它们。

标签: c

解决方案


几点:

int main(int argc, char* argv[]) {

我建议您在继续之前检查这里的参数数量

setup_screen();
setup();

// File input
char textExtracted[250];

可以加入声明,但始终检查来自 I/O 的返回值

FILE* file_handle = = fopen(argv[1], "r");
if (NULL == file_handle)
{
  perror(argv[1]);
  return EXIT_FAILURE;
}

下面不是从文件中读取的正确方法,相反,您应该先尝试从文件中读取,然后检查读取的错误/eof/enuff 字节

// while(fgets(textExtracted,sizeof(textExtracted), 1, file_handle) > 0) {}

while(!feof(file_handle)){
    fgets(textExtracted, 150, file_handle);
}

看起来您认为 fgets 在您多次调用它时会附加到 textExtracted ,但事实并非如此!文件中的每一行都将覆盖先前读取的行。另请注意,\n 字符包含在您的缓冲区中。

但是由于您的文件看起来很小,您可以将整个内容读入缓冲区并使用它。

// int size = fread(textExtracted, sizeof(textExtracted), 1, file_handle);

更好的是首先检查文件的大小,然后使用 malloc 分配一个缓冲区来保存整个文件或逐个字符地读取文件,并即时执行您需要执行的任何命令。例如,switch 语句非常适合作为状态机

switch( myreadchar )
{
   case 'A':
     break;
   case 'B':
     break;
   ...
}

textExtracted[0] 是一个字符, textExtracted 是整个数组,所以不是

printf("%s", textExtracted[0]);

printf("%s", textExtracted);

甚至更好

fputs(textExtracted, stdout);

return 0;   

推荐阅读