gpt4 book ai didi

c - 如何在c中使用fscanf从文件中读取格式化数据

转载 作者:行者123 更新时间:2023-11-30 19:31:47 24 4
gpt4 key购买 nike

我想读取这些数据并将它们放入结构数组中,但它不起作用

#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 只适用于空格,但我需要使用 *** 来分隔我的数据

最佳答案

该程序以当前格式读取您的数据,并以“-”分隔条目的形式生成输出(如您提供的 printf 语句中所示):

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

#define MAXBUF 500

int parse_string(char* s,char* a[]);

struct book {
char bookName[50];
char authorName[50];
long price;
int year;
};

int main() {

FILE *data;
char buf[MAXBUF];
char *sp, *words[MAXBUF];
int nw;

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;

// Read each line into buf and parse it into words,
// assign words into structure fields
while((sp = fgets(buf, MAXBUF, data))!= NULL){
nw=parse_string(buf, words);

// If number of words different than number of
// fields in the structure exit with an error
if (nw!=4){
printf("Error - number of parsed words does not match number of fields in the structure!\n");
exit(1);
}

// Assign values, convert strings to long and int
strncpy(myBook.bookName, words[0], strlen(words[0])+1);
strncpy(myBook.authorName, words[1], strlen(words[1])+1);

myBook.price = atol(words[2]);
myBook.year = atoi(words[3]);

// Add to book array
books[n] = myBook;

n++;
}

// Print
int i;
for(i=0;i<n;i++){
printf("%s - %s - %ld - %d \n",books[i].bookName,books[i].authorName,books[i].price,books[i].year);
}
}
}


/* Function to parse a line of input into an aray of words */
/* s - pointer to the char array (line) to be parsed
* a - array of pointers to parsed elements
* returns number of elements in a*/
int parse_string(char* s, char* a[])
{
int nw,j;
a[0] = strtok(s,"*\t\n\r\v\f");
nw = 1;
while((a[nw]= strtok(NULL,"*\t\n\r\v\f"))!=NULL)
nw++;
return nw;
}

就像评论中所建议的那样,该程序使用 fgets 一次读取文件行。然后,它使用解析函数根据给定的分隔符将每一行解析为单词。解析函数很小,并且使用strtok和硬编码的分隔符集。根据您的输入,它不使用空格作为分隔符,而是使用 *。它允许使用其他分隔符,例如合理的新行,但可能不是合理的制表符。

下一步是将每个单词分配给 book 结构中的字段。在此之前,检查从解析函数返回的单词数 (nw) 是否等于当前字段数。最后,如果是 - 它将具有任何必要转换的成员分配给 myBook 并将此条目添加到 book 数组中。

一些可以作为练习省略的改进是使用输入文件名启用命令行参数,而不是对其进行硬编码。将输出写入文件也很好,在这种情况下,输出文件将是第二个命令行参数。最后,正如评论中提到的,您可以并且应该提供一些输入大小检查您正在使用的数组的大小。

关于c - 如何在c中使用fscanf从文件中读取格式化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48027793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com