读取指定为参数的文件及其 return 行

Read a file specified as an argument and return its' lines

我有一个练习,我必须读取一个包含字符串的文件,我必须 return 使用 one/multiple 数组的内容(这是因为这个练习的第二部分要求这些要反转的行,我在输入时遇到问题 - 因此寻求帮助)。 到目前为止,我有这个:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LENGTH 1024

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

    char* input[LENGTH];

    if(argc==2){

        FILE *fp = fopen(argv[1], "rt");

        if(fp!=NULL){

            int i=0;
            while(fgets(input, sizeof(input), fp)!=NULL){
                input[i] = (char*)malloc(sizeof(char) * (LENGTH));
                fgets(input, sizeof(input), fp);
                i++;
            }
            printf("%s", *input);
            free(input);

        }
        else{
            printf("File opening unsuccessful!");
        }
    }
    else{
        printf("Enter an argument.");
    }

    return 0;

}

我还要检查内存分配是否失败。当从命令行 运行 时,该程序的当前形式 return 什么都没有。

编辑:我认为很重要的一点是我收到了很多警告:

passing argument 1 of 'fgets' from incompatible pointer type [-Wincompatible-pointer-types]|

attempt to free a non-heap object 'input' [-Wfree-nonheap-object]|

编辑 2: 输入示例:

These
are
strings

...和预期输出:

esehT
era
sgnirts

练习中指定一行的最大长度为1024个字符。

你可能想要这样的东西。

评论在代码里

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LENGTH 1024

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

  if (argc == 2) {

    FILE* fp = fopen(argv[1], "rt");

    if (fp != NULL) {
      char** lines = NULL;         // pointer to pointers to lines read
      int nboflines = 0;           // total number of lines read

      char input[LENGTH];          // temporary input buffer

      while (fgets(input, sizeof(input), fp) != NULL) {
        char* newline = malloc(strlen(input) + 1);        // allocate memory for line (+1 for null terminator)
        strcpy(newline, input);                           // copy line just read
        newline[strcspn(newline, "\n")] = 0;              // remove \n if any
        nboflines++;                                      // one more line
        lines = realloc(lines, nboflines * sizeof(char*)); // reallocate memory for one more line
        lines[nboflines - 1] = newline;                    // store the pointer to the line
      }

      fclose(fp);

      for (int i = 0; i < nboflines; i++)    // print the lins we've read
      {
        printf("%s\n", lines[i]);
      }
    }
    else {
      printf("File opening unsuccessful!");
    }
  }
  else {
    printf("Enter an argument.");
  }

  return 0;
}

关于删除 fgets 留下的 \n 的说明:Removing trailing newline character from fgets() input

免责声明:

  • 内存分配函数没有错误检查
  • 内存未释放。这留作练习。
  • 这里使用的方式realloc效率不是很高
  • 你还需要写每行反转显示的代码

您可能应该将其分解为不同的功能:

  • 读取文件的函数和returns指向行的指针和读取的行数,
  • 一个显示行读取的函数
  • 一个反转一行的函数(待写)
  • 一个将所有行反转的函数(待写)

这留作练习。