从文件(.txt)读取并保存到char*C中

从文件(.txt)读取并保存到char*C中,c,file,memory,C,File,Memory,我有一个包含的file.txt文件,例如,这是一个txt文件,该内容可以是可变的,我需要一个函数来读取file.txt并将其内容保存到char*中 file.txt包含->这是一个.txt文件 我需要一个char*readedContent,它包含一个.txt文件 首先,我将char*str str str contains this is a.txt文件的内容保存到file.txt文件中,然后我尝试从该文件中获取字符串,但该字符串的字符数多于该.txt文件。通常添加空格或@等字符 我的职能是:

我有一个包含的file.txt文件,例如,这是一个txt文件,该内容可以是可变的,我需要一个函数来读取file.txt并将其内容保存到char*中

file.txt包含->这是一个.txt文件

我需要一个char*readedContent,它包含一个.txt文件

首先,我将char*str str str contains this is a.txt文件的内容保存到file.txt文件中,然后我尝试从该文件中获取字符串,但该字符串的字符数多于该.txt文件。通常添加空格或@等字符

我的职能是:

char *special_char_remplace(char *str){


    FILE *f1;
    f1 = fopen("file.txt","w+"); 
    fprintf(f1,"%s", str);
    fclose(f1);

    size_t len, bytesRead;
    char *readedContent;
    FILE* f2;

    f2 = fopen("file.txt", "rb");

    fseek(f2, 0, SEEK_END);
    len = ftell(f2);
    rewind(f2);

    readedContent = (char*) malloc(sizeof(char) * len + 1);
    readedContent[len] = '\0'; // Is needed only for printing to stdout with printf

    bytesRead = fread(readedContent, sizeof(char), len, f2);

    printf("STRING: %s\n",  readedContent);

    fclose(f2);

    return readedContent;
}
我遇到的问题是,在char*readedContent中,我的char多于文件.txt的内容

非常感谢。

试试看

fseek(f2, 0L, SEEK_END);
long tmpSize = ftell(f2);
fseek(f2, 0L, SEEK_SET);    
而不是倒带

同时移动readedContent[len]='\0';弗瑞德之后

我遇到的问题是,在char*readedContent中,我的char多于文件.txt的内容

获取的字节数超过文件中的字符数的最可能原因是:fread逐字节读取文件,因此,如果文件的编码对某些代码点使用多个字节,则缓冲区将包含一个或多个字符的多个字节

要验证这一理论并解决问题,请编写一个简短的程序,使用API将预期消息的字节(这是一个.txt文件)写入文本文件。以这种方式编写的文件应使用fread正确读取


在linux上正常工作

要阅读文本内容,可以使用fopenfile.txt,rt;你能举例说明你的程序读取的文件内容和读取的内容吗?你在Windows上吗?您是否遇到^Z control-Z标记文件结尾的问题,但在该问题之后,最多有255个额外字节到达块的结尾?如果使用r或rt模式打开文件,会发生什么情况?最好将fread更改为FREADDEDCONTENT,len,1,f2,以避免字节读取小于该len的可能性。但这不会导致您描述的问题。@EAGER\u STUDENT不太正确,rt会根据操作系统向您的数据中添加一些额外的内容,如新行,而不会根据其倒带对文件内容进行精确的字节复制f2相当于fseekf2,0L,SEEK\u集。虽然我同意移动readedContent[len]='\0'可能更清晰,但这不会有任何区别。不使用倒带有什么好处?为什么要改变任务的位置?@simonc好的。。。我宁愿使用双fseek,它对我来说更可读。我从来没用过rewind@Martin佩里:为什么我们不应该使用倒带呢?我试过了,但效果比以前完全好。非常感谢。我尝试过的一件事是:我写了一个函数,它接收一个char*字符串,并用fwrite写入一个文件,然后像我在文章中展示的那样读取它,但它不起作用,当我从文件中读取时,我的char数比我写的要多。。。我不明白。。。非常感谢much@dikerex你能用你用来写.txt文件内容的程序的代码更新这个问题吗?@dikerex你在printf的str前面有一个额外的星号,替换为fprintff1,%s,str;,程序将按预期运行。@dikerex您能用printfSTRING替换最后一个printf吗:%s%d%d\n,readedContent,len,strlenstr;看看打印的是什么?STRING:这是一个.txt文件35 19一点解释一下你做了什么会很好。另请注意你答案的格式。@Volkanİlbeyli对不起,我还是新手,正在熟悉规则和文化
 #include<stdio.h>
    #include<stdlib.h>
    int main()
    {

        char *str = "this is my file";
        FILE *f1;
        f1 = fopen("file.txt","w");
        fprintf(f1,"%s",str);
        fclose(f1);
        //string written in file.txt

        size_t len, bytesRead;
        char *readedContent;
        FILE* f2;
        f2 = fopen("file.txt", "rb");
        fseek(f2, 0, SEEK_END);
        len = ftell(f2);
        //will need it for length
        rewind(f2);
        readedContent = (char*) malloc(sizeof(char) * len + 1);
        readedContent[len] = '\0'; // Is needed only for printing to stdout with printf
        bytesRead = fread(readedContent, sizeof(char), len, f2);
        //fread will read it from file and 
        //readed content will be pointed by readedContent pointer
        printf("STRING: %s\n",  readedContent);
        printf("the size is %zd\n",bytesRead);
        fclose(f2);

        return 1;
    }
 STRING: this is my file
`the size is 15`