
fread処理を用いてファイルの内容を取得した後、printf("%s\n", p);で参照してみるとaaa 1 21 333
bb 24 325 6 c 7 82 98とまとめてファイルの値を取得してしまいます。この取得した値をひとつずつ分けてNODEのnameとtenに格納しようとしているのですがうまくいきません。どうすればいいでしょうか?
それと、第三引数で選択した値がレコードの個数とありますがすべて選択されてしまうのどうしてでしょうか?
test.txtの中身
aaa 1 21 333
bb 24 325 6
c 7 82 98
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<malloc.h>
typedef struct{ /*出力レイアウト*/
char name[20];
int ten[3];
}RECORD;
FILE *fpbin; /*FILE構造体(グローバル変数)*/
void main(void)
{
RECORD *p;
p = malloc(1);
fpbin = fopen("test.txt","r");
fread(p,sizeof(RECORD), 1, fpbin);
printf("%s\n", p);
}
No.1ベストアンサー
- 回答日時:
fwriteしたものならfreadでいいんでしょうが、この場合は、読み込んでいるものがテキストファイルなので、freadで読み込むのは適当ではないです。
あと
RECORD *p;
p = malloc(1);
は
RECORD *p;
p = (RECORD*)malloc(sizeof(RECODD));
の様にしないといけないと思います。
一行読み込みをして
sscanfなどを使ってそれぞれ変数に設定する必要があります。
No.4
- 回答日時:
freadで読むのであればバイナリデータのファイルを準備しましょう。
バイナリエディタを使ってtest.txtというファイルを作ってください。+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
000000 61 61 61 00 00 00 00 00 00 00 00 00 00 00 00 00
000010 00 00 00 00 01 00 00 00 15 00 00 00 4D 01 00 00
000020 62 62 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000030 00 00 00 00 18 00 00 00 45 01 00 00 06 00 00 00
000040 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000050 00 00 00 00 07 00 00 00 52 00 00 00 60 00 00 00
ついでに、mallocやprintfの部分がおかしいです。
void main(void)
{
RECORD *p;
p = malloc(sizeof(RECORD));
fpbin = fopen("test.txt","rb");
fread(p,sizeof(RECORD), 1, fpbin);
printf("%s\n", p->name);
}
No.3
- 回答日時:
fscanfを使いましょう。
void main(void)
{
RECORD rec;
fpbin = fopen("test.txt","r");
fscanf(fpbin, "%s %d %d %d", rec.name, &rec.ten[0], &rec.ten[1], &rec.ten[2]);
fclose(fpbin);
printf("%s %d %d %d\n", rec.name, rec.ten[0], rec.ten[1], rec.ten[2]);
}
これで1行分です。
複数行読み込むときは、fscanf を繰り返せばよいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
printf による16進表示について
-
C++で指定文字列のカウント方法...
-
#defineが使用するメモリ領域に...
-
【C言語】全角文字の配列を、全...
-
プログラミングの授業の課題です
-
C言語で複数列のデータを1列の...
-
エラーについて質問です。
-
C言語でのCSVファイルの読み出...
-
*をユーザーが入力した数字の数...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
2÷3などの余りについて
-
数字以外が入力されたらエラー...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
DWORDの実際の型は何でしょうか
-
複数桁10進数の*桁目だけを抽出...
-
エクセルの問題です。絶対値の...
-
C言語 関数プロトタイプ宣言の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
C++で指定文字列のカウント方法...
-
コマンドファイルから、ビット...
-
C言語のプログラムで、途中で止...
-
終了条件Ctrl+zについて,結果表...
-
配列への文字列の格納について
-
困ってます!書き方がわかりま...
-
ファイルから数字列を16進数の...
-
fread(),fwrite()等について
-
0x8, スペース, 0x8をプログラ...
-
static付き宣言の初期化
-
構造体メンバの初期化
-
c言語で文書を読み込み、単語の...
おすすめ情報