1

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

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

我需要一个 char *readedContent 包含“这是一个 .txt 文件”。

首先,我将 char *str 的内容(str 包含“这是一个 .txt 文件”)保存到“file.txt”中,然后我尝试从该文件中获取字符串,但该字符串的字符数比“This是一个 .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 中,我的字符比 file.txt 的内容多。

非常感谢。

4

3 回答 3

1

我遇到的问题是,char *readedContent我的字符比file.txt' 的内容多。

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

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

于 2013-05-08T16:58:49.250 回答
0

尝试

fseek(f2, 0L, SEEK_END);
long tmpSize = ftell(f2);
fseek(f2, 0L, SEEK_SET);    

代替rewind(f2)

readedContent[len] = '\0';在fread之后也移动

于 2013-05-08T16:52:59.160 回答
-1
 #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;
    }

linux上的输出

 STRING: this is my file
`the size is 15`

在linux上正常工作

于 2013-05-08T18:49:07.027 回答