0

作成しているプログラム内の構造体に少し問題があります。バックグラウンド; ARMv7チップ上でCでコードを開発しています。システムには、ファイルアクセス用のFAT16ファイルシステムを備えたSDカードがあります。FAT16ファイルの読み取りおよび書き込み操作用のライブラリを使用して、ファイルの出力/入力を処理しています。現在、main関数の前に構造体をグローバルに宣言しています。

struct config_information
{
    char *name;

    //version
    char *fwversion;

    //IP address
    char *ip;
};

//Declare structs for config information
struct config_information config;
struct config_information loadedconfig;

ポインタは文字列用です。たとえば、&config.nameを使用して、これらの変数にデータを読み込みます。シリアルポートを介して受信した文字を別のcharポインターに読み込んで、別の文字にstrcatするために作成した関数を使用する必要がありますが、これは正しく機能し、ユーザーが入力した詳細が記録された入力と一致することを確認しました(クイックがあります)誰かが疑問に思っていた場合に詳細を求めるプロンプトを表示するためのターミナルウィンドウのプロンプト画面)。

次に、提供されているライブラリ関数を実装して、構造体をファイルに保存します。

fat16_write_file(CONF_FILE,&config, READBUFSIZE);

CONF_FILEは使用するファイルの単なるファイルハンドルであり、&configは出力バッファーであり、READBUFSIZEはバッファーのサイズです(148として定義され、私の目的には十分な大きさですが、後で構造体のサイズを計算するために変更したいと思います。出力し、ファイルサイズを計算して、正しく読み戻すことができるようにします)。明確になっていない場合に備えて、参照用にライブラリによって提供される関数定義を最後に冒頭陳述とともに追加しました。

これは完全に機能し、ファイルの出力は次のとおりです。Name1.1192.168.1.1に空白がたくさんあります。明らかに、名前としてNameを入力し、ファームウェアとして1.1を入力し、IPは自明です。

素朴に、私はこれを使って宣言したloadconfig構造体にそれを読み戻すために逆を行うことができると思いました。

fat16_read_file(CONF_FILE,&loadedconfig,READBUFSIZE);

構造体には、読み戻す量を知るための事前定義されたサイズがないため、明らかにこれが機能する見込みはありません。

では、保存したデータを元の構造体と同じ構造体に戻すにはどうすればよいでしょうか。名前は、大規模ではなく、任意のサイズにすることができますが、安全に予測することはできません。FWバージョンは#。#のみになり、IPは明らかにすでに定義された制限内にあります。

正しい方向へのヒントや微調整をありがとう。範囲を理解するためにさらに情報が必要だと思われる場合は、お問い合わせください。

参考のために;

/**
 * \ingroup fat16_file
 * Reads data from a file.
 *
 * The data requested is read from the current file location.
 *
 * \param[in] fd The file handle of the file from which to read.
 * \param[out] buffer The buffer into which to write.
 * \param[in] buffer_len The amount of data to read.
 * \returns The number of bytes read, 0 on end of file, or -1 on failure.
 * \see fat16_write_file
 */
int16_t fat16_read_file(struct fat16_file_struct* fd, uint8_t* buffer, uint16_t buffer_len)

/**
 * \ingroup fat16_file
 * Writes data to a file.
 *
 * The data is written to the current file location.
 *
 * \param[in] fd The file handle of the file to which to write.
 * \param[in] buffer The buffer from which to read the data to be written.
 * \param[in] buffer_len The amount of data to write.
 * \returns The number of bytes written, 0 on disk full, or -1 on failure.
 * \see fat16_read_file
 */
int16_t fat16_write_file(struct fat16_file_struct* fd, const uint8_t* buffer, uint16_t buffer_len)
4

1 に答える 1

2

構造体をファイルに書き込んで読み戻したい場合は、そのメンバーにポインターを使用しないでください。次のように宣言する必要があります。

/* specify sizes according to your needs */
#define MAX_NAME_SIZE 16
#define MAX_FWVERSION_SIZE 16
#define MAX_IP_SIZE 16

struct config_information
{
    char name[MAX_NAME_SIZE];

    //version
    char fwversion[MAX_FWVERSION_SIZE];

    //IP address
    char ip[MAX_IP_SIZE];
};

// write it to a file
fat16_write_file(CONF_FILE,&config, sizeof(config_information));

// read it from a file
fat16_read_file(CONF_FILE,&loadedconfig, sizeof(config_information));
于 2011-02-27T19:18:45.237 に答える