实在改不出来了,运行情况如下,求大神帮帮
任务描述从 herb.txt 中读取食材的基本信息,创建一个中药材信息的顺序表,基于该顺序表,实现食材基本信息的增加功能。
编程要求
输入中药材草药名、英文名、生长习性、繁殖方法、田间管理、病虫防治、采收加工、性味、归经、功效和功能主治,将该中药材的基本信息添加到herb.txt中的最后。新增成功后,输出 herb.txt 的最后一行即新增中药材信息。(注:由于中药材草药名是唯一的,因此在增加时需要判断该草药名是否存在于 herb.txt 中,若存在,则输出“增加失败”。)
#include <bits/stdc++.h>
#define MAXSIZE 10000
using namespace std;
typedef struct {
char name; // 草药名
char sname; // 英文名
char growth_habits; // 生长习性
char reproductive; // 繁殖方法
char field_management; // 田间管理
char pest_control; // 病虫防治
char harvesting; // 采收加工
char taste; // 性味
string channel_tropism; // 归经
int channel_tropism_num = 0; // 归经数量
char effect; // 功效
char functional_indications; // 功能主治
} Herb;
typedef struct {
Herb* elem; // 指向数组的指针
int length; // 数组的长度
} SqList;
void InitList(SqList& L) {
// 使用动态内存分配new进行初始化
L.elem = new Herb;
if(!L.elem) exit(1);
L.length = 0;
}
void FreeList(SqList& L) {
// 释放内存
delete[] L.elem;
L.length = 0;
}
void ReadFile(SqList& L, string filename) {
// 从文件中读取中药材信息,将其按顺序存入L.elem指向的数组中
ifstream infile(filename);
if (!infile.is_open()) {
cerr << "无法打开文件: " << filename << endl;
exit(1);
}
char s;
bool flag = false;
while (infile.getline(s, sizeof s, '#')) {
Herb temp;
stringstream streams(s);
string ss;
int type = 0;
if (flag)
getline(streams, ss, '\n');
flag = true;
while (getline(streams, ss, '\n')) {
switch (type) {
case 0:
strcpy(temp.name, ss.substr(7).c_str()); // 草药名:
break;
case 1:
strcpy(temp.sname, ss.substr(7).c_str()); // 英文名:
break;
case 2:
strcpy(temp.growth_habits, ss.substr(9).c_str()); // 生长习性:
break;
case 3:
strcpy(temp.reproductive, ss.substr(9).c_str()); // 繁殖方法:
break;
case 4:
strcpy(temp.field_management, ss.substr(9).c_str()); // 田间管理:
break;
case 5:
strcpy(temp.pest_control, ss.substr(9).c_str()); // 病虫防治:
break;
case 6:
strcpy(temp.harvesting, ss.substr(9).c_str()); // 采收加工:
break;
case 7:
strcpy(temp.taste, ss.substr(5).c_str()); // 性味:
break;
case 8: {
size_t colonPos = ss.find(':');
if (colonPos != string::npos) {
string channels = ss.substr(colonPos);
stringstream channelsStream(channels);
string channel;
while (getline(channelsStream, channel, ',')) {
if (temp.channel_tropism_num < 6) { // 防止数组越界
temp.channel_tropism = channel;
}
}
}
break;
}
case 9:
strcpy(temp.effect, ss.substr(5).c_str()); // 功效:
break;
case 10:
strcpy(temp.functional_indications, ss.substr(10).c_str()); // 功能主治:
break;
default:
break;
}
type++;
}
L.elem = temp;
}
infile.close();
}
void SaveFile(SqList& L, string filename) {
// 保存中药材信息到文件
ofstream outfile(filename);
for (int i = 0; i < L.length; ++i) {
outfile << "草药名:" << L.elem.name << "\n"
<< "英文名:" << L.elem.sname << "\n"
<< "生长习性:" << L.elem.growth_habits << "\n"
<< "繁殖方法:" << L.elem.reproductive << "\n"
<< "田间管理:" << L.elem.field_management << "\n"
<< "病虫防治:" << L.elem.pest_control << "\n"
<< "采收加工:" << L.elem.harvesting << "\n"
<< "性味:" << L.elem.taste << "\n"
<< "归经:";
for (int j = 0; j < L.elem.channel_tropism_num; ++j) {
outfile << L.elem.channel_tropism << ",";
}
outfile << "\n"
<< "功效:" << L.elem.effect << "\n"
<< "功能主治:" << L.elem.functional_indications << "\n"
<< "#\n";
}
outfile.close();
}
bool InsertHerb(SqList& L) {
// 插入中药材信息,输入中药材的草药名、英文名、生长习性、繁殖方法、田间管理、病虫防治、采收加工、性味、归经、功效和功能主治信息
// 如果插入成功,返回true,否则,返回false
Herb newHerb;
string name, sname, growth_habits, reproductive, field_management, pest_control, harvesting, taste, effect, functional_indications;
getline(cin, name);
strncpy(newHerb.name, name.c_str(), 99);
newHerb.name = '\0';
getline(cin, sname);
strncpy(newHerb.sname, sname.c_str(), 99);
newHerb.sname = '\0';
getline(cin, growth_habits);
strncpy(newHerb.growth_habits, growth_habits.c_str(), 4999);
newHerb.growth_habits = '\0';
getline(cin, reproductive);
strncpy(newHerb.reproductive, reproductive.c_str(), 4999);
newHerb.reproductive = '\0';
getline(cin, field_management);
strncpy(newHerb.field_management, field_management.c_str(), 4999);
newHerb.field_management = '\0';
getline(cin, pest_control);
strncpy(newHerb.pest_control, pest_control.c_str(), 4999);
newHerb.pest_control = '\0';
getline(cin, harvesting);
strncpy(newHerb.harvesting, harvesting.c_str(), 4999);
newHerb.harvesting = '\0';
getline(cin, taste);
strncpy(newHerb.taste, taste.c_str(), 4999);
newHerb.taste = '\0';
string channelInput;
getline(cin, channelInput);
stringstream channelStream(channelInput);
string channel;
while (getline(channelStream, channel, ',')) {
if (newHerb.channel_tropism_num < 6) {
newHerb.channel_tropism = channel;
}
}
getline(cin, effect);
strncpy(newHerb.effect, effect.c_str(), 4999);
newHerb.effect = '\0';
getline(cin, functional_indications);
strncpy(newHerb.functional_indications, functional_indications.c_str(), 4999);
newHerb.functional_indications = '\0';
for (int i = 0; i < L.length; ++i) {
if (strcmp(L.elem.name, newHerb.name) == 0) {
cout << "增加失败" << endl;
return false;
}
}
L.elem = newHerb;
return true;
}
void Print(SqList& L) {
// 输出中药材信息
if (L.length > 0) {
Herb lastHerb = L.elem;
cout << "草药名:" << lastHerb.name << "\n"
<< "英文名:" << lastHerb.sname << "\n"
<< "生长习性:" << lastHerb.growth_habits << "\n"
<< "繁殖方法:" << lastHerb.reproductive << "\n"
<< "田间管理:" << lastHerb.field_management << "\n"
<< "病虫防治:" << lastHerb.pest_control << "\n"
<< "采收加工:" << lastHerb.harvesting << "\n"
<< "性味:" << lastHerb.taste << "\n"
<< "归经:";
for (int j = 0; j < lastHerb.channel_tropism_num; ++j) {
cout << lastHerb.channel_tropism;
if (j < lastHerb.channel_tropism_num - 1) {
cout << ", "; // 控制归经间的分隔符
}
}
cout << "\n"
<< "功效:" << lastHerb.effect << "\n"
<< "功能主治:" << lastHerb.functional_indications << "\n";
} else {
cout << "没有数据" << endl;
}
}
int main(){
SqList L;
InitList(L);
string originFilename = "/data/workspace/myshixun/1.1.1-中药材信息增加/herb.txt";
string newFilename = "/data/workspace/myshixun/1.1.1-中药材信息增加/new_herb.txt";
ReadFile(L, originFilename);
if (InsertHerb(L)){
SaveFile(L, newFilename);
ReadFile(L, newFilename);
Print(L);
}
else{
cout << "增加失败" << endl;
}
FreeList(L);
return 0;
}
草药名:��:沉香
英文名:��:Aquilaria agallocha
生长习性:性:自木香生长在热带亚热带地区。对温度适应性强,“温年变幅在0~37C的地区都能生长,能耐短期箱冻。幼龄树耐阴,成龄树喜光,阳光充足有利子结香、对上壤适应性广,红壤或黄壤均可生长,在士层深厚肥沃的上壤上生长快,但结香少;在瘠薄的十壤上生长慢,但利于结香。
繁殖方法:法:选地与整地:选山地或丘陵肥力中等的缓坡,于冬季翻地挖穴,待来年春种植。行株距2米×1.5米,开穴深、宽各40厘米。每穴施腐熟厩肥或堆肥50~80千克。种子繁殖:于6~7月份采果实开裂的种子,随采随播于苗床。如不能及时播种,可用干沙混合后贮放于瓦盆中。播种行株距10厘米×5厘米。苗床温度27~29°C时,播后约半个月出苗。苗高50~80厘米出圃定植。
田间管理:理:幼龄树生长慢,可在行间种玉米、黄豆、砂姜等作物。成年树下可种砂仁、益智、绞股蓝等耐阴药物。结合中耕除草,春季施1次粪水或尿素,尿素每株25~50克;秋李施农家肥或钙镁磷肥,培土越冬。
病虫防治:治:每年6~7月份卷叶蛾为害叶片。在幼蛾卷叶前用90%敌百虫800倍液或80%敌敌畏1000倍液喷杀。
采收加工:工:一般种植10年以上、胸径15厘米以上的植株,取香质量较好。植株树脂形成(结香)主要受机械刺激或微生物影响所致。如在树干上凿数个阔长深(厘米)为2X5~10X5~10的长形洞,用泥土封闭,让其结香;或用利刀横切树干的一侧,每隔40~50厘米开一宽1厘米的洞,深为树干径的1/2,用特制的菌种塞满小洞后,用塑料薄膜包扎封口。当上下伤口的结香相连时,便整株砍下采香。用刀剔除木质部及腐烂部分.剩下褐黑的树脂即是中药沉香。
性味:�:辛、苦,微温。
归经:
功效:�:心
功能主治:��:脾 看来你的代码是为了从 `herb.txt` 文件中读取药材信息并存储在一个顺序表中,但代码似乎没有全部呈现出来。下面是一个关于如何完成这个任务的整体思路和实现,帮助你找到并解决代码问题。
### 整体解决方案:
1. **读取文件信息**:从 `herb.txt` 文件中读取已有的中药材信息,并存入顺序表。
2. **检查重复**:在新增之前检查草药名是否已存在。
3. **增加新信息**:如不存在,则将新药材信息添加到顺序表并写回文件。
4. **显示结果**:在成功添加后,显示加入的药材信息。
### 代码示例:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
typedef struct {
string name; // 草药名
string sname; // 英文名
string growth_habits; // 生长习性
string reproductive; // 繁殖方法
string field_management; // 田间管理
string pest_control; // 病虫防治
string harvesting; // 采收加工
string taste; // 性味
string channel_tropism; // 归经
string effect; // 功效
string functional_indications; // 功能主治
} Herb;
class HerbList {
public:
vector<Herb> herbs;
void readFromFile(const string& filename) {
ifstream infile(filename);
string line;
while (getline(infile, line)) {
istringstream iss(line);
Herb herb;
iss >> herb.name >> herb.sname >> herb.growth_habits >> herb.reproductive
>> herb.field_management >> herb.pest_control >> herb.harvesting
>> herb.taste >> herb.channel_tropism >> herb.effect >> herb.functional_indications;
herbs.push_back(herb);
}
infile.close();
}
bool isHerbExist(const string& herbName) {
for (const auto& herb : herbs) {
if (herb.name == herbName) {
return true;
}
}
return false;
}
void addHerb(const Herb& herb, const string& filename) {
if (isHerbExist(herb.name)) {
cout << "增加失败" << endl;
} else {
herbs.push_back(herb);
ofstream outfile(filename, ios_base::app);
outfile << herb.name << " " << herb.sname << " " << herb.growth_habits << " "
<< herb.reproductive << " " << herb.field_management << " "
<< herb.pest_control << " " << herb.harvesting << " " << herb.taste << " "
<< herb.channel_tropism << " " << herb.effect << " "
<< herb.functional_indications << endl;
outfile.close();
cout << "添加成功: " << herb.name << endl;
}
}
};
int main() {
HerbList herbList;
string filename = "herb.txt";
herbList.readFromFile(filename);
Herb newHerb;
// 假设以下值由用户输入获取
newHerb.name = "新草药";
newHerb.sname = "NewHerb";
newHerb.growth_habits = "生长习性";
newHerb.reproductive = "繁殖方法";
newHerb.field_management = "田间管理";
newHerb.pest_control = "病虫防治";
newHerb.harvesting = "采收加工";
newHerb.taste = "性味";
newHerb.channel_tropism = "归经";
newHerb.effect = "功效";
newHerb.functional_indications = "功能主治";
herbList.addHerb(newHerb, filename);
return 0;
}
### 注意事项:
- 确保文件路径正确,文件存在并可读写。
- 用户输入的数据应当合法,并以适当格式存储。
- 每个字段应与 `herb.txt` 的文件结构匹配,方便正确解析。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 cy,蹲
c++忘光了,写了个c的给你提供一下思路
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include<search.h>
#define MAX_LINE_LENGTH20000
#define NUM_STRINGS 10
// 冒泡排序
void bubbleSort(int positions[], int n) {
int i, j;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (positions > positions) {
// 交换两个元素的位置
int temp = positions;
positions = positions;
positions = temp;
}
}
}
}
// 函数声明
int find_string(const char* haystack, const char* needle, int* position);
void split_and_save(const char* content, int positions[], int num_positions, const char* output_file);
int main() {
FILE* input_file;
fopen_s(&input_file, "11.txt", "r");
if (input_file == NULL) {
perror("无法打开输入文件");
return 1;
}
// 读取文件内容
char content;
// if (fgets(content, MAX_LINE_LENGTH, input_file) == NULL) {
size_t result = fread(content, 1, 1500, input_file);
if (result < 2000) {
if (feof(input_file)) {
printf("提前到达文件末尾,只读取了 %zu 个元素\n", result);
}
else {
perror("读取文件出错");
}
}
fclose(input_file);
content ='\0' ;
size_t len = strlen(content);
printf_s("len:%d 读取文件内容: %s\n", len, content);
// printf_s("len:%d 读取文件内容: %s\n", len,content);
// 目标字符串
char target_strings = {
"草药名", "英文名", "生长习性", "繁殖方法", "田间管理",
"病虫防治", "采收加工", "性味","功能主治","功效"
};
// 记录匹配位置
int positions = { 0 };
for (int i = 0; i < NUM_STRINGS; i++) {
if (find_string(content, target_strings, &positions) == -1) {
printf("未找到字符串: %s\n", target_strings);
}
else {
printf("找到字符串: %s, 位置: %d\n", target_strings, positions);
}
}
//位置排序
bubbleSort(positions, NUM_STRINGS);
for (int i = 0; i < NUM_STRINGS; i++)
{
printf("%d排序位置: %d\n", i, positions);
}
// 分割并保存结果
split_and_save(content, positions, NUM_STRINGS, "2.txt");
return 0;
}
int find_string(const char* haystack, const char* needle, int* position) {
*position = strstr(haystack, needle) - haystack;
return *position;
}
void split_and_save(const char* content, int positions[], int num_positions, const char* output_file) {
// 获取文件长度
size_t len = strlen(content);
FILE* output;
fopen_s(&output, output_file, "w");
if (output == NULL) {
perror("无法打开输出文件");
return;
}
for (int i = 0; i < num_positions - 1; i++) {
fwrite(content + positions, 1, positions- positions, output);
fputc('\n', output); // 每段之间添加换行符
}
////最后一段
fwrite(content + positions, 1, len - positions, output);
fclose(output);
}
页:
[1]