【问题标题】:How do I run C code on linux with input file from command line?如何使用命令行输入文件在 linux 上运行 C 代码?
【发布时间】:2021-07-19 07:02:38
【问题描述】:

我正在尝试用 C 语言完成一些简单的任务,并在 Linux 的命令行中运行它们。 我在使用 C 和从命令行运行代码时遇到了一些问题,给定的文件名作为参数给出。我以前从来没有用 C 写过代码。

从文件中删除偶数。文件名被转移到 程序作为命令行中的参数。节目变化 这个文件。

我该怎么做?

  • 从文件中读取并将结果写入同一文件
  • 从文件中读取数字而不是数字(例如:我需要能够读取“22”作为单个输入,而不是包含“2”的两个单独的字符)
  • 在 Linux 中通过参数给出文件名。 (例如:./main.c 文件.txt)

我尝试编写 c 代码:

#include <stdio.h>
int main ()
{
    FILE *f = fopen ("arr.txt", "r");
    char c = getc (f);
    int count = 0;
    int arr[20];
    while (c != EOF)
    {
        if(c % 2 != 0){
            arr[count] = c;
            count = count + 1;
        }
        c = getc (f);
    }


    for (int i=0; i<count; i++){
            putchar(arr[i]);
    }
    fclose (f);
    getchar ();
    return 0;
} 

【问题讨论】:

  • 缺少样本输入输出(去掉偶数是不充分的描述); 通过参数给出文件名与您编写的完全一样,除了您的可执行程序通常没有扩展名 .c.
  • 欢迎来到 StackOverflow!该网站的工作方式是您提供一段代码或一个非常具体的问题,我们会尽力帮助您找到解决方案。我们无法为您编写代码,也无法从头开始教您 C。如果您编辑您的问题以包含一个实际的问题,最好伴随您尝试解决您遇到的问题,我们或许能够提供更好的帮助。
  • “从文件中读取数字而不是数字”是指在单个字符(例如“3”)上读取表示数字的字符串(例如“3.14”)吗?
  • @Armali 我从中读取的文件中的数字可以用逗号、空格或不同的行分隔。由我来决定他们的分离方法并专门为那个方法编写代码。
  • @Somn 用数字而不是数字我的意思是例如“123”而不是“1”、“2”和“3”。

标签: c linux bash command


【解决方案1】:

这是一个满足您要求的完整程序:

  • 将结果写入同一个文件 - 它在文件中保留一个读写位置,并在数字已被删除的情况下将字符复制到文件开头;最后,现在更短的文件必须被截断。 (请注意,对于大文件,写入第二个文件会更有效率。)
  • 从文件中读取数字而不是数字 - 不必读取整数,只需存储数字的写入起始位置(这可以在每个非数字处完成)和奇偶校验最后一位。
  • 通过参数给出文件名 - 如果定义int main(int argc, char *argv[]),如果argc 至少为2,则第一个参数在argv[1] 中。
#include <stdio.h>
#include <ctype.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    if (argc < 2) return 1;   // no argument given
    FILE *f = fopen(argv[1], "rb+");
    if (!f) return 1; // if fopen failed
    // read, write and number position
    long rpos = 0, wpos = 0, npos = 0;
    int even = 0, c;  // int to hold EOF
    while (c = getc(f), c != EOF)
    {
        if (isdigit(c)) even = c%2 == 0;
        else
        {
            if (even) wpos = npos, even = 0;
            npos = wpos+1;    // next may be number
        }
        fseek(f, wpos++, SEEK_SET);
        putc(c, f);
        fseek(f, ++rpos, SEEK_SET);
    }
    ftruncate(fileno(f), wpos); // shorten the file
}

【讨论】:

    【解决方案2】:

    我会这样做(删除额外的声明 => 微优化)

      /**
       * Check if file is avaiable.
       */ 
      if (f == NULL)
      {
        printf("File is not available \n");
      }
      else
      {
        
        /**
         * Populate array with even numbers.
         */ 
        while ((ch = fgetc(f)) != EOF)
            ch % 2 != 0 ? push(arr, ch); : continue;
    
        /**
         * Write to file those numbers.
         */ 
        for (int i = 0; i < 20; i++)
            fprintf(f, "%s", arr[i]);
      }
    

    推送实现:

    void push(int el, int **arr)
    {
        int *arr_temp = *arr;
    
        *arr = NULL;
        *arr = (int*) malloc(sizeof(int)*(n - 1));
    
        (*arr)[0] = el;
        for(int i = 0; i < (int)n - 1; i++)
        {
            (*arr)[i + 1] = arr_temp[i];
        }
    }
    

    为了写入同一个文件,不关闭和打开它,你应该提供两个方法,w+(写和读),这个方法会清除它的内容。

    因此,为此更改打开文件的行。

    FILE *f = fopen ("arr.txt", "w+");
    

    您应该寻找实现动态数组(指针和内存管理)的方法。

    通过这个示例,您可以简单地继续在主循环内编写一个临时变量,用于存储一个数字序列,并将这些值堆叠

    类似这样的东西(伪代码,玩得开心:)):

    DELIMITER one of (',' | '|' | '.' | etc);
    
    char[] temp;
    if(ch not DELIMITER)
      push ch on temp;
    else
      push temp to arr and clear it's content;
    

    希望这是有用的。

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 2013-11-23
      • 1970-01-01
      • 2010-10-25
      相关资源
      最近更新 更多