【问题标题】:copying from file to pointer从文件复制到指针
【发布时间】:2015-04-15 11:14:26
【问题描述】:

我正在编写一个通过程序,但我遇到了一个小问题。 我想根据从文件中读取的句子大小动态分配内存位置。这个指针也应该在内容中有这个文本

什么时候文件会有句子:

“一二三四五”

然后我想要 char* 示例,其中分配了 25 个字符的内存位置。 当我想在控制台上打印此文本时,我想通过

printf("%c", example);

控制台应该是这样的:

一二三四五

我就是这样做的:

char* czyt = (char*)malloc(sizeof(fgets( line/*static variable*/,
                                         500 /*MAX LINE LENGHT*/,
                                         wejscie /*FILE*/ )));

但是在这种情况下czyt没有这句话,我需要使用静态变量。

【问题讨论】:

  • 当您在指针上使用sizeof 时(如fgets 返回的指针),您会得到指针 的大小,而不是指针所指向的大小。如果要获取字符串的长度,请使用strlen
  • 是的。确实如此。但是当我使用 strlen 时,我仍然需要使用静态变量:“line”。我想 czyt 在内容中包含“一二三四五”+ 25 个字符的内存位置。
  • 对了,你有没有想过如果fgets调用失败会发生什么?分配零字节可能仍然有效,您根本不知道输入操作失败了。
  • 我想知道该怎么做。我需要编写程序,将按字母顺序对所有行进行排序,何时获得文件“第一行:Ccccc Bbbbb 第二行:Aaaaa”然后输出应如下所示:“第一行:Aaaaa 第二行:Bbbbb Cccccc”
  • @TymoteuszPinior - 使用 Joachim Pileborg 的建议,但将其与指针一起使用,而不是 line 变量

标签: c file fgets


【解决方案1】:

如果您关心的是在没有缓冲区的情况下解决此问题:这有点不寻常。但在类似 POSIX 的系统上,您可以使用stat()(参见http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html)。

效率较低的是使用 Posix'lseek():open 文件,使用 int fileLength = lseek(fd, 0, SEEK_END); 查找到末尾并分配 fileLength 字节。

无论您使用什么函数,它都会告诉您文件的大小,而无需读取任何内容,这样您就可以分配一个完全符合要求大小的缓冲区。在读取文件之前不要忘记使用lseek(fd, 0, SEEK_SET) 回退文件,或者关闭它并使用fopen() 再次打开。

【讨论】:

    【解决方案2】:

    对文件行进行排序的最理想方法是 使用字典树。创建具有单行的字典树 然后进行深度优先遍历。

    这是一个简单的程序,可以根据行长进行动态缓冲区分配(假设行长不超过 500)

    int main(int argc, char const *argv[])
    {
            char string[500];
            char *str;
    
            FILE *in_file = fopen("abc.txt", "r");
            if (in_file == NULL)
            {
                    printf("Error file missing\n");
                    exit(-1);
            }
            while ( fgets(string, 500, in_file) != NULL)
            {
                    str = (char *)  malloc ( sizeof(char) * strlen(string));
                    strcpy(str, string);
                    printf("%s", str);
            }
            fclose(in_file);
            return 0;
    }
    

    如果你想对它们进行排序,你可以使用链表来存储这些数据,也可以使用一个指针数组(它将保存所有 malloc 行的指针地址),然后通过操作进行排序指针

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 2018-10-11
      • 2020-02-26
      • 2010-09-27
      • 2020-06-05
      • 2015-01-17
      相关资源
      最近更新 更多