-1

ファイルを1行ずつ読み取る関数を作成したいと思います。1 行に 1 つずつが 1 つの名前です。

int readConfig(char ** path, FILES ** files )
{
    FILE* f;
    f = fopen("file", "r");   
    int ch;
    while ((ch=fgetc(f)) != EOF )
    {

    }
return 0;
}

fgetc 関数を使用してファイルを解析するにはどうすればよいですか? そして、結果を files[count].name に取得する方法は?

4

2 に答える 2

3

すぐに:

char configFile [11] = "kernels.cfg";

[11] は小さすぎます。試す:

char configFile [12] = "kernels.cfg";

また

char configFile [] = "kernels.cfg";          /* let the compiler do the counting */

また、ch には char が小さすぎます -- 以下を使用します。

int ch;

fgets()また、一度に 1 行全体を読み取る方が よりも簡単に使用できることもわかりますfgetc()

于 2014-09-10T20:29:40.607 に答える
2

文字列リテラルを変更したために SIGSEGV を取得しており、未定義の動作(SIGSEGV など) を引き起こしています。filenamename変数に何を格納する必要があるかわかりません。行ごとの場合:

strcpy(files[count].filename,'.bin');

ファイル名変数に「.bin」を追加するつもりだった場合、このアプローチは間違っています。を使用する必要がありますstrcatstrcpyこの変数の先頭からファイル名に書き込むため、以前にそこに保存された一部の文字が上書きされます。strcpyヌル終了文字も追加するため、それを出力したい場合、printf はその\0文字で停止し、それ以上進みません。ただし、実際の問題はmalloc、構造体の変数にある程度のスペースを割り当てる必要があることです。その後、それらを変更できるようになります。

簡単な例を考えてみましょう:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct file {
    char* name;
    char* filename;
};

int main(void)
{
    struct file x;
    x.name = malloc(30);
    x.filename = malloc(40);

    strncpy(x.name, "copied_string", 13);
    printf("%s\n", x.name);

    strcat(x.name, "_suffix"); 
    printf("%s\n", x.name);

    strcpy(x.name, "erased");
    printf("%s\n", x.name);

    free(x.name);
    free(x.filename);
    return 0;
}

出力:

copied_string
copied_string_suffix
erased

これにより、クラッシュの原因がもう少し明確になるはずです。fgetsまたはgetlineの使用も検討する必要があります。freeあなたがしたことを覚えておいてくださいmalloc

編集:

を呼び出すreadConfig(&path, &files);と、タイプ のポインターが readConfig に渡されますFILES (*)[256]FILES files[256];に変更することを検討してください

FILES* files = malloc(sizeof(FILES)*256);

そして後であなたの関数を次のように呼び出しますreadConfig(&path, files);

次に、 readConfig 関数に互換性のある型の を渡しますfiles

于 2014-09-11T11:12:26.107 に答える