1

このようなデータを含むファイルがあります

{0 /Data1/ , 0x00, 0, 0xFF},

{1 /data2/ , 0x00, 0, 0xFF},

{2 /data3/ , 0x00, 0, 0xFF},

{3 /data4/ , 0x00, 0, 0xFF}, ...

各行の 2 列目だけを印刷したい。以下は私が取り組んだコードです。

#include<stdio.h>
#include<string.h>
int main ()
{
char filename[] = "file.txt";
FILE *file = fopen(filename, "r");
if(file!= NULL)
{
char line[128];
char * word1;
char  word2;
char  word3;
int i=0;
clrscr();
while ( fgets( line, sizeof line, file)!= NULL)
{
i=0;
word1 = strtok(line, " ,");

while(word1!= NULL)
{
i++;
if(i==2 ){

printf("%s\n",word1);
}
word1 = strtok(NULL," ,");
}

}
fclose(file);
}
else
{
perror(filename);
}


getch();

return 0;
}

それは正常に動作します。各行に印刷されている値を配列に保存できますか? 私はこのようなことを試しました

if(i==2){
word2 = * (word1);
} 
printf("%s\n",word1);

しかし、それは私にヌルポインタの割り当てを与えます。印刷する値を配列に格納する方法は?

4

3 に答える 3

1

文字列 word1 の最初の文字のみを word2 に保存しています。

すべての 2 番目の列を保存する場合は、ポインタの動的配列を (char *) に割り当ててから、各単語/列にスペースを割り当て、strcpy でコピーする必要があります。これは、word1 が while の各反復で変化するためです。参照のみを保存しないでください。

于 2012-04-16T20:42:00.930 に答える
0

次のようなものを試してください。

#define MAX_BUFFER_SIZE 256
/* ... */

char ** lines = malloc(MAX_BUFFER_SIZE + 1);
char ** p = lines;
char ** newbuf;
int len;
int bytesloaded = 0;  
int buf_size = MAX_BUFFER_SIZE;  
assert(lines != NULL);
//... loop etc.. 

if(i==2 ){
   len = strlen(word1);
   bytesloaded += len;

   if(bytesloaded >= buf_size) /* Controls buffer size. For avoid buffer overflow/heap corruption/UB. */
   {
      buf_size += MAX_BUFFER_SIZE;
      newbuf = realloc(lines, buf_size);

      if(!newbuf)  /* return or break. */ 
      {  
        printf("Allocation failed.\n");
        free(lines);
        return 1;
      }

       lines = newbuf;
    }

    *p++ = word1; /* store the word in lines */
    printf("%s\n",word1);
}

\0注:最初のループの終了後に、0ターミネーターを配列に入れることを忘れないでください。

このコードはテストしていませんが、機能すると思います。

方法の簡単な例:a dynamic memory allocation、サイズの制御、メモリの再割り当て、値の保存。

于 2012-04-17T00:47:50.893 に答える
0

動的に割り当てられた配列を使用できます。これは、より多くのスペースが必要になると大きくなります。C で割り当てられた場合でも、大きな可変長配列に固定値 -1 があるのはなぜですか?を参照してください。さらにヘルプが必要です。

于 2012-04-16T20:08:46.323 に答える