如何用C语言将文本文件中的单行内容拆分为多行输出
如何将单行订单文本拆分为指定多行格式并修改C语言读取代码
拆分逻辑说明
你的订单文本结构是:开头为用户名,后续每个商品条目以DRxx/SWxx/SKxx格式的编码开头,包含商品名称(可能带空格)和价格。要得到目标多行格式,遵循以下规则:
- 提取第一个连续非空白字段作为单独一行;
- 从剩余内容里,每次定位到下一个
DR/SW/SK开头的编码位置,将两个编码之间的内容(包含前一个编码)作为一行; - 处理最后一个条目,直到文本结束。
修改后的C语言AddOdr函数代码
#include <stdio.h> #include <string.h> #include <ctype.h> void AddOdr() { FILE *fp = fopen("temp.txt", "r"); if (!fp) { perror("Failed to open file"); return; } // 读取整行内容(假设单行内容不超过缓冲区大小) char buffer[1024]; if (fgets(buffer, sizeof(buffer), fp) == NULL) { perror("Failed to read file"); fclose(fp); return; } fclose(fp); char *ptr = buffer; // 跳过开头空白字符 while (isspace((unsigned char)*ptr)) ptr++; // 提取用户名(第一个非空白字段) char *username_end = ptr; while (!isspace((unsigned char)*username_end)) username_end++; printf("- %.*s\n", (int)(username_end - ptr), ptr); ptr = username_end; // 跳过用户名后的空白字符 while (isspace((unsigned char)*ptr)) ptr++; // 处理每个商品条目 while (*ptr != '\0') { // 记录当前条目的起始位置 char *entry_start = ptr; // 寻找下一个条目的起始(DR/SW/SK开头) char *next_entry = ptr + 1; while (*next_entry != '\0') { // 检查是否是DR/SW/SK开头 if ((*next_entry == 'D' && *(next_entry+1) == 'R') || (*next_entry == 'S' && *(next_entry+1) == 'W') || (*next_entry == 'S' && *(next_entry+1) == 'K')) { // 跳过前面的空白,确保是新条目的开头 char *temp = next_entry; while (temp > entry_start && isspace((unsigned char)*(temp-1))) temp--; if (temp == next_entry) { break; } } next_entry++; } // 输出当前条目,去除末尾多余空白 char *entry_end = next_entry; while (entry_end > entry_start && isspace((unsigned char)*(entry_end-1))) entry_end--; printf("- %.*s\n", (int)(entry_end - entry_start), entry_start); // 移动指针到下一个条目 ptr = next_entry; // 跳过空白字符 while (isspace((unsigned char)*ptr)) ptr++; } }
代码关键说明
- 读取整行:用
fgets读取单行文本到缓冲区,避免逐字符处理的低效; - 提取用户名:定位第一个非空白字段的起止位置,单独输出;
- 识别商品条目:通过检查
DR/SW/SK前缀来定位每个条目的分界点; - 清理空白:输出前去除每个条目末尾的多余空白,保证格式整洁。
内容的提问来源于stack exchange,提问作者Kemmy
相关产品推荐
相关产品推荐

