3

私は非常に単純な問題を抱えています。ファイルの内容を C の char 配列に読み込む必要があります。ファイルは常に 2 列の文字としてフォーマットされます。たとえば、次のようになります。

A B
B C
E X
C D

各文字はグラフの頂点を表しており、これについては後で扱います。私は C++ と Java を使用してプログラミングを学びましたが、特に C にはあまり詳しくありません。

私が理解できない問題の原因は、ファイルが複数行の長さであるという事実です。各文字が配列のスロットを占有する必要があるため、この場合は : array[0] = 'A', array[1] = 'B', array[2] = 'B', array[3] = 'C'などになります。

最終的には、配列に重複が含まれないようにする必要がありますが、後で処理できます。今学期の初めに、ファイルから 1 行の int を読み取るプログラムを作成し、正常に動作したので、そのコードのほとんどをコピーしましたが、この場合は動作しません。これが私がこれまでに持っているものです:

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

int main (int argc, char *argv[])
{
   int i;
   int count = 0;
   char * vertexArray;
   char ch = '\0';

// open file
   FILE *file = fopen( argv[1], "r" );

// count number of lines in file
   while  ((ch=fgetc(file)) != EOF)
        if(ch == '\n') count++;

// numbers of vertices is twice the number of lines
   int size = count*2;

// declare vertex array
    vertexArray = (char*) calloc(size, sizeof(char));

// read in the file to the array
   for(i=0; i<size; i++)
        fscanf(file, "%c", &vertexArray[i]);

// print the array
   for(i=0; i<size; i++)
        printf("%c\n", vertexArray[i]);

   fclose( file );
}

ファイルが開いたり、適切に読み取られたりすることなどをテストする必要があることはわかっていますが、後で追加します。今のところ、配列を読み込もうとしています。この場合の出力は 8 行の空白行です。どんな助けでも素晴らしいでしょう!

4

4 に答える 4

1

ファイルをループして行数をカウントすると、ファイル ポインターは既に にEOFあるため、配列には何も読み取られません。せいぜい最後の文字と同じ値になりますが、おそらくセグメンテーション違反が表示されるでしょう。

あなたがしたいことは

rewind(file);

あなたの前に

//read file into the array

次に、ファイルの先頭から開始します。また、通常は末尾に座っているfgetcため、行末をどのように処理するのかわかりません。'\0'これを行う別の方法は、fscanfそのように使用することです

i = 0;
while (!feof(file)){
   fscanf(file, "%c %c", &vertexArray[i], &vertexArray[i+1]);
   i++;
}

関数はフラグが設定されているfeof(FILE *)かどうかをチェックし、 を押すと停止します。EOFEOF

更新:ch asと定義すれば、うまくint chいくはずです。このスレッドを見てください。

これは私のために働いたコードです:

int main (int argc, char *argv[])
{
    int i;
    int count = 0;
    char * vertexArray;
    int ch, size;

    FILE *file;
    file = fopen(argv[1], "r");

    while ((ch = fgetc(file) != EOF))
       count++;

    size = count*2;
    vertexArray = (char*) calloc(size, sizeof(char));
    rewind(file);

    for(i=0; i<size; i++)
       fscanf(file, "%c ", &vertexArray[i]);

    for(i=0; i<size; i++)
       fprintf(stderr, "%c\n", vertexArray[i]);

    fclose(file);

}

NEW EDITの後のスペースに注意してくださいfscanf(file, "%c ", &vertexArray[i]);。これはC、文字を読み取った後にすべての空白をスキップすることを示しています。スペースがないと、空白も文字として読み取られます。これで修正されるはずです。

于 2012-11-15T09:21:14.913 に答える
0

fgetcファイル位置インジケータを進めます。現在のコードで 0 に戻るか、行数を気にせずに行を読み取る必要があります。

于 2012-11-15T08:56:54.450 に答える
0

データの読み込みを開始すると、行のカウントでファイルが使い果たされています。ファイルを巻き戻すか、再度開く必要があります。

于 2012-11-15T08:57:10.463 に答える