Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这样不行?动态记忆初学者程序_C_File_Dynamic_Malloc_Realloc - Fatal编程技术网

C 为什么这样不行?动态记忆初学者程序

C 为什么这样不行?动态记忆初学者程序,c,file,dynamic,malloc,realloc,C,File,Dynamic,Malloc,Realloc,我试图将全文文件keimeno.txt复制到动态内存数组中,每次最多使用100个字符的缓冲区。为了在最后测试它,我试图获得结果。我就是不能让它工作。不知道最后的printf是否有问题,或者整个程序都错了 另外,动态数组的大小应该为0,所以如果有人也能告诉我怎么做,那就太好了 提前感谢。有几个问题: int main() { //FILE *out = fopen("keimeno.txt", "w+"); FILE *in = fopen("keimeno.txt", "

我试图将全文文件keimeno.txt复制到动态内存数组中,每次最多使用100个字符的缓冲区。为了在最后测试它,我试图获得结果。我就是不能让它工作。不知道最后的printf是否有问题,或者整个程序都错了

另外,动态数组的大小应该为0,所以如果有人也能告诉我怎么做,那就太好了


提前感谢。

有几个问题:

int main()
{   
    //FILE *out = fopen("keimeno.txt", "w+");

    FILE *in = fopen("keimeno.txt", "r");
    int fullbufflen=0 , i;

    char buffer[100];
    fgets(buffer, 100, in);

    int bufflen = strlen(buffer);
    char *text;
    text =calloc(bufflen,sizeof(char));
    char *strcat(text, buffer); 
    //  printf("line of \"keimeno.txt\": %s", buffer);
    //  printf("size of line \"keimeno.txt\": %i\n\n", bufflen);

    fullbufflen = bufflen;  

    while(fgets(buffer, 100, in)!=NULL)
    {         
        //  printf("line of \"keimeno.txt\": %s", buffer);
        //  printf("size of line \"keimeno.txt\": %i\n\n", bufflen);
        text =realloc(text,bufflen*sizeof(char));
        char *strcat(text, buffer);

        fullbufflen = bufflen + fullbufflen ;
    }
    for (i = 0;i<fullbufflen;i++)
    {
        printf("%c\n",text[i]);
    }
}
这不是调用函数的方式。这是一个函数声明,而且是不正确的,因为它没有定义参数的类型

要调用strcat,只需执行以下操作:

char *strcat(text, buffer);
接下来,您没有为缓冲区分配足够的空间:

strcat(text, buffer);
您需要为终止字符串的空字节添加空间:

text =calloc(bufflen,sizeof(char));
同样地:

text =calloc(bufflen + 1,sizeof(char));
这只会重新分配总共的bufflen字节。它不会将bufflen字节添加到已经分配的内容中,并且bufflen从第一次在while循环之外设置时起保持不变。改为这样做:

text =realloc(text,bufflen*sizeof(char));
这为当前长度、附加缓冲区和空字节提供了足够的空间

最后,确保最后使用fclosein和freetext清理资源,并确保检查fopen的返回值以确保文件成功打开,以及realloc/calloc以确保分配工作正常

在进行上述更改后,您的代码应该如下所示:

bufflen = strlen(buffer);
text =realloc(text,bufflen+fullbufflen+1);

以下是一种可能的解决方案:

int main(void)
{
    //FILE *out = fopen("keimeno.txt", "w+");

    FILE *in = fopen("keimeno.txt", "r");
    if (in == NULL) {
        perror("open failed");
        exit(1);
    }
    int fullbufflen=0 , i;

    char buffer[100];
    fgets(buffer, 100, in);

    int bufflen = strlen(buffer);
    char *text;
    text =calloc(bufflen+1,sizeof(char));
    if (text == NULL) {
        perror("calloc failed");
        exit(1);
    }
    strcat(text, buffer);
//  printf("line of \"keimeno.txt\": %s", buffer);
//  printf("size of line \"keimeno.txt\": %i\n\n", bufflen);

    fullbufflen = bufflen;

    while(fgets(buffer, 100, in)!=NULL)
    {
    //  printf("line of \"keimeno.txt\": %s", buffer);
    //  printf("size of line \"keimeno.txt\": %i\n\n", bufflen);
        bufflen = strlen(buffer);
        text =realloc(text,bufflen+fullbufflen+1);
        if (text == NULL) {
            perror("realloc failed");
            exit(1);
        }
        strcat(text, buffer);

        fullbufflen = bufflen + fullbufflen ;
    }
    fclose(in);
    for (i = 0;i<fullbufflen;i++)
    {
        printf("%c\n",text[i]);
    }
    free(text);
}

与原始文件一样,输入文件名是硬编码的,次优…

char*strcattext,buffer是什么;线路?你的通话记录错了2。1.您需要为终止的nul字节分配1个额外字节。2.你真的不需要calloc你需要malloc。我用这个完全错了吗?非常感谢你的努力。这几乎完美,但从我所看到的,它只显示了整个文本的一部分,在txt文件中,我有一个大约600个字符的文本,它将只显示300或更多。我发现这个奇怪的原因,因为它能工作,缓冲区是100c,为什么它会卡在这样一个数字里?@begginer3我在程序中运行了这个源代码,它读写了整个过程。它的打印方式是每行输出一个字符,因此可能很难看到。请尝试在最后取出printf中的\n,然后查看输出结果。此尝试存在许多问题。1无错误检查。2条长输入线是一个问题。3主要签名是wrong@JohnHascall排长队不是问题。对fgets的下一个调用将继续它中断的地方。我用超过100个字符的行进行了测试,它仍然有效。我确实更改了主签名,并在fopen和calloc/realloc中添加了错误检查。@JohnHascall能否请您详细说明,以便我可以修复它们?谢谢您的努力,但我觉得这对我的教授来说似乎很重要,因为我们根本没有触及您使用的某些内容。无论如何,谢谢。是的,如果这是一项作业,你肯定应该交上你自己的工作,但请随意为你将来的作业挑选一些指针:1检查错误,2使用正确的变量类型,3不要在代码中粘贴“魔法”数字,使用定义,4个空格帮助可读性,5带警告编译打开anks获取建议,但是你对“神奇”数字的意思是什么,给我一个例子,这样我就可以修正它。除了0、1和无穷大之外,几乎任何数字都是神奇的数字。想象一下,阅读别人的代码,看到ipy=1512;这是一个神奇的数字。这是什么意思?谁知道呢?但如果你看到ipy=每年的局数;当你看到它的时候,这就开始有意义了。
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>


#define ERR     (-1) 
#define GROW    100


static void die ( const char * msg ) { perror(msg); exit(1); }


int main ( void ) {

        char *  filename        = "in.txt";
        size_t  buffSize        = 0;
        size_t  buffUsed        = 0;
        ssize_t bytesRead       = 0;
        char *  buffer          = NULL;
        char *  tmp;
        int     fd;

        fd = open(filename, O_RDONLY, 0);
        if (fd == ERR) die("open");

        do {
                buffUsed += (size_t)bytesRead;
                if (buffUsed == buffSize) {
                        tmp = realloc(buffer, buffSize += GROW);
                        if (tmp == NULL) die("realloc");
                        buffer = tmp;
                }
                bytesRead = read(fd, buffer + buffUsed, buffSize - buffUsed);
                if (bytesRead == ERR) die("read");
        } while (bytesRead > 0);

        if (write(STDOUT_FILENO, buffer, buffUsed) == ERR) die("write");
        free(buffer);
        if (close(fd) == ERR) die("close");

        return 0;
}