【问题标题】:Read txt file from standard input and store whole text into char array从标准输入读取 txt 文件并将整个文本存储到 char 数组中
【发布时间】:2021-03-20 16:43:41
【问题描述】:

让我描述一下我要做什么。

  1. 编译源代码并使用输入文本文件运行

    gcc main.c -o main

    ./main

  2. 那么'text.txt'中的文本应该被存储到一个单一的变量中。我不确定,但我认为这应该是 char 数组。

  3. 最后,我想循环遍历 'text.txt' 的每个字符及其索引;在python中应该是这样的

    i = 0
    
    while i < len(string):
    
        print(string[i])
    
        if (~~~):
    
            i -= 10(or some other numbers)
    
        else:
    
            i += 1

需要考虑的几点

  1. i 可以从第 i-10 个字符开始递减并再次打印。
  2. 程序不知道输入文本文件的长度。
  3. 我无法在源中指定文件目录;输入文本必须通过终端中的标准输入。

我怎样才能用 C 写这个?

以下是我在 C 中的尝试,但没有奏效。

int main(){
    char A;
    short i;

    scanf("%s", A);
    printf("%s", A);
    for (i=0; i < strlen(A); i++) {
        printf("%c", A[i]);
    }

    return 0;
}

【问题讨论】:

  • 您尝试过哪些无效的方法?在 C 中有无数种方法可以做到这一点。
  • @MarcoBonelli 我附加了它!

标签: c


【解决方案1】:

您可以通过多种方式做到这一点,让我们从获得适当的文件长度开始。

FILE *f = fopen("textfile.txt", "rb");
fseek(f, 0, SEEK_END); // goes to the end of file
long fsize = ftell(f); // tells what position in bytes is 
fclose (f)

f = fopen("textfile.txt", "r");

您注意到我正在使用rb 或读取二进制文件。那是因为要克服这样一个事实,即如果您在非二进制模式下使用 fseek()ftell(),您将陷入未定义的行为,并且 Windows 机器和 (*)nix 机器之间的结果可能会有所不同。

现在如何将文本文件读入字符串。有多种方法

  1. 不推荐使用getc()
  2. 使用fscanf() 也不是首选,比getc() 更好,因为它可以同时读取多个字节
  3. 使用fgets(),您可以指定读取文件的大小,从而避免缓冲区溢出。

以上是快速而肮脏的阅读方式,不知道你的 DE 是什么样的(什么操作系统、编译器等)我可以更详细地说明如何做到这一点,但 tnx 到 @Nail 这里是 article,你可以阅读。您可以使用它并为不同的操作系统设置标志,而不是使用我的方法。

【讨论】:

  • 代码的方法是合理的,但“二进制流不需要有意义地支持 fseek 调用,其值为 SEEK_END..”。我认为以不同模式打开文件没有任何优势。
  • @chux-ReinstateMonica 我尊重您的 cmets,但是如果您不以二进制形式打开它,Windows 不会读取错误的文件大小吗?此外,如果您将其保留为二进制并且他决定使用某些函数,它可能会读取属性。现在必须去,但会在几个小时后回来完成这个:) TBH,有一段时间没玩这个了。
  • 总体目标不是查找文件大小,而是将文本存储到一个变量中。在 Windows 中读取文本会将文件的 "\r\n" 压缩为 "\n",因此如果在文本模式下完成,可以使用出租文件“大小”将文本存储在 string 中。如果以二进制模式完成,不妨也以二进制模式读取。 - 通过fread() 说。 IAC,然后可以使用rewind() 而不是fclose()/fopen()
  • cmu 表示这不太可能导致问题,但仍然可能是不好的做法。
  • @chux-ReinstateMonica, tnx 为你的评论现在我明白你的意思了,但这不是用来在 Windows 上造成段错误的吗?我是 Linux 上的更多开发人员,但我记得在 Windows 上存在问题。也许当您使用 Windows 机器上的程序从 Linux 读取文件时?老实说,我不记得了。再次为您的 cmets Tnx。
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
相关资源
最近更新 更多