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

时间:2013-05-08 16:49:03

标签: c file memory

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

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

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

首先,我将char * str的内容(str包含“这是一个.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中,我的字符数比file.txt的内容多。

非常感谢。

3 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:0)

尝试

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

而不是rewind(f2)

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

答案 2 :(得分:-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上正常工作