C 扫描文件并分配正确的空间来保存文件

C 扫描文件并分配正确的空间来保存文件,c,C,我目前正在使用fscanf获取空格分隔的单词。我建立了一个固定大小的char[]来保存每个提取的单词。如何创建具有正确空格数的char[],以容纳单词中正确的字符数? 谢谢 编辑:如果我在字符[1000]上做了一个strdup,而字符[1000]实际上只包含3个字符,那么strdup会在堆上为1000或4个字符(用于终止字符)保留空间吗?没有唯一的方法。其思想是只分配一个足够大的字符串来容纳可能最大的字符串。阅读完之后,您可以分配一个大小正好合适的缓冲区,并在需要时复制它 此外,还可以在fsca

我目前正在使用fscanf获取空格分隔的单词。我建立了一个固定大小的char[]来保存每个提取的单词。如何创建具有正确空格数的char[],以容纳单词中正确的字符数? 谢谢


编辑:如果我在字符[1000]上做了一个strdup,而字符[1000]实际上只包含3个字符,那么strdup会在堆上为1000或4个字符(用于终止字符)保留空间吗?

没有唯一的方法。其思想是只分配一个足够大的字符串来容纳可能最大的字符串。阅读完之后,您可以分配一个大小正好合适的缓冲区,并在需要时复制它

此外,还可以在fscanf格式字符串中指定宽度,以限制读取的字符数,以确保缓冲区永远不会溢出


但是如果你分配了一个缓冲区,比如250个字符,很难想象一个单词不适合这个缓冲区。

没有唯一的方法。其思想是只分配一个足够大的字符串来容纳可能最大的字符串。阅读完之后,您可以分配一个大小正好合适的缓冲区,并在需要时复制它

此外,还可以在fscanf格式字符串中指定宽度,以限制读取的字符数,以确保缓冲区永远不会溢出


但是,如果您分配了一个缓冲区,比如250个字符,很难想象一个单词不适合该缓冲区。

这里有一个解决方案,只涉及两个分配,没有
realloc

  • 通过查找文件末尾并使用
    ftell
    确定文件大小
  • 分配此大小的内存块,并使用
    fread
    将整个文件读入其中
  • 计算此块中的字数
  • 分配一个
    char*
    数组,该数组能够容纳指向这么多单词的指针
  • 再次循环遍历文本块,为每个指针指定单词开头的地址,并将单词末尾的单词分隔符替换为0(空字符)

  • 此外,还有一点哲学上的问题:如果您认为这种插入字符串终止符并将一个巨大的字符串拆分为许多小字符串来使用的方法是丑陋的、粗俗的,等等。那么您可能应该忘记用C编程,而使用Python或其他更高级的语言。在最大限度地减少潜在故障点的同时,能够进行更高效的数据操作,这几乎是任何人都应该使用C进行此类计算的唯一原因。如果你想把每一个单词单独分配,你用C语言来做就是让生活变成了地狱;其他语言很乐意将这种低效率(以及大量可能的故障点)隐藏在友好的字符串运算符后面。

    这里有一个解决方案,只涉及两次分配,没有
    realloc

  • 通过查找文件末尾并使用
    ftell
    确定文件大小
  • 分配此大小的内存块,并使用
    fread
    将整个文件读入其中
  • 计算此块中的字数
  • 分配一个
    char*
    数组,该数组能够容纳指向这么多单词的指针
  • 再次循环遍历文本块,为每个指针指定单词开头的地址,并将单词末尾的单词分隔符替换为0(空字符)

  • 此外,还有一点哲学上的问题:如果您认为这种插入字符串终止符并将一个巨大的字符串拆分为许多小字符串来使用的方法是丑陋的、粗俗的,等等。那么您可能应该忘记用C编程,而使用Python或其他更高级的语言。在最大限度地减少潜在故障点的同时,能够进行更高效的数据操作,这几乎是任何人都应该使用C进行此类计算的唯一原因。如果你想把每一个单词单独分配,你用C语言来做就是让生活变成了地狱;其他语言很乐意将这种低效(以及大量可能的故障点)隐藏在友好的字符串运算符后面。

    您的意思是分配的
    char[]
    对于使用
    fscanf()
    strdup()读取的单词来说不够大
    只分配它正在复制的字符串中第一个NUL
    '\0'
    之前使用的空间,因此在您的示例中是4,而不是1000。因此,我为char[]分配了一个大空间。存在范围为1到1000的字符串。如果每个字符串可能只有3个字符,我不想为每个字符串保留1000字节。您的意思是,您分配的
    char[]
    不够大,无法容纳您使用
    fscanf()
    strdup()
    读取的单词。
    strdup()
    只分配它正在复制的字符串中的第一个NUL
    '\0'
    所使用的空间-因此4,在您的示例中不是1000。因此,我为char[]分配了一个较大的空间。存在范围为1到1000的字符串。我不想为每个字符串保留1000字节,如果它们可能只有3个字符。
    char *ptr;    
    ptr = (char*) malloc(size_of_string + 1);
    
    char first = ptr[0];
    /* etc. */