1

たとえば、「これはtxtファイルです」(この内容は可変である可能性があります)を含むfile.txtがあり、file.txtを読み取ってその内容をchar *に保存する関数が必要です。

file.txt の内容 -> 「これは .txt ファイルです」

「これは .txt ファイルです」を含む char *readedContent が必要です。

最初に、char *str (str には "this is a .txt file" が含まれています) の内容を "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()読み取るため、ファイルのエンコーディングが一部のコードポイントに複数のバイトを使用する場合、バッファーには次のものが含まれます1 つまたは複数の文字の複数バイト。

この理論を検証して問題を解決するには、 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';、フレッドの後に移動します

于 2013-05-08T16:52:59.160 に答える