ファイルからフォーマットされたデータを読み取るように、Cの関数fscanfを使用するが、それはは、どのように私はこれらのデータを読み込み、構造体の配列に入れたい
#include<stdio.h>
struct book {
char bookName[50];
char authorName[50];
long price;
int year;
}
main() {
FILE *data;
data=fopen("library.txt", "r");
if (data == NULL) {
printf("File Could not be opened!\n");
}
else {
struct book myBook;
struct book books[20];
int n=0;
while (!feof(data))
{
fscanf(data,"%s***%s***%d***%d\n",&myBook.bookName,&myBook.authorName,&myBook.price,&myBook.year);
books[n]=myBook;
n++;
}
int i;
for(i=0;i<n;i++){
printf("%s - %s - %d - %d \n",books[i].bookName,books[i].authorName,books[i].price,books[i].year);
}
}
}
動作しないと出力が
C - b - 0 - 232159429
programing***Fatemeh - b - 0 - 232159429
Kazemi***15000***1391 - b - 0 - 232159429
C - b - 0 - 232159429
programs***Ali - b - 0 - 232159429
Ahmadpour***20000***1392 - b - 0 - 232159429
Programing***Mona - b - 0 - 232159429
Ghassemi***25000***1389 - b - 0 - 232159429
C - b - 0 - 232159429
programing - b - 0 - 232159429
(advanced)***Sara - b - 0 - 232159429
Hamidi***40000***1385 - b - 0 - 232159429
です
しかし、私の実際のデータは、私が何をすべき
C programing***Fatemeh Kazemi***15000***1391
Cprograms***Ali Ahmadpour***20000***1392
Programing***Mona Ghassemi***25000***1389
C programing (advanced)***Sara Hamidi***40000***1385
のですか? fscanfはスペースのみで動作しますが、私はデータを分離するために***を使用する必要があります
主な問題の1つは、 '"%s "'形式が*スペースで区切られた*文字列を読み込むことです。もう一つの問題はループ状態で 'feof()'を使うべきではないということです(http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)。 3番目の問題は、['fscanf'](http://en.cppreference.com/w/c/io/fscanf)*が何を返すかをチェックしないことです。四番目は、配列のためにアドレス&演算子 '&'( '&myBook.bookName'のように)を使うべきではないということです。 –
@ usr2564301フォーマット指定子の外にはありません。書式文字列中の '*'は、入力中のリテラル '*'にマッチします。 ''%* s "'は全く異なるものです。 –
fscanf(データ、 "%s ***%s ***%d ***%d \ n"、&myBook.bookName、&myBook.authorName、&myBook.price、&myBook.year); – ali