c - 如何从文本文件 (C) 中读取特定数据?
问题描述
我对 C(以及这个网站)有点陌生,并且对我正在从事的项目有疑问。我坚持的部分是文件 I/O 的东西,因为我在上一堂课中从未学过这部分。因此,输入 (.txt) 文件如下所示:
REGISTERS
R5 11
R7 15
R21 4
MEMORY
4 12
12 92
[OTHER STUFF]
该文件为我们提供了任意寄存器编号,然后是其内容(R0 到 31,省略了值 0 的 Regs)。下一节给出了类似格式的内存位置,然后是内容。然后是我以后可以处理的更多部分。
我的问题是:如何读取寄存器/内存位置及其值?目前我有一个大小为 32 的数组来存储内容,还有一个用于 Reg 编号和值的变量(例如:Registers[regNumber] = regValue;),但我不知道如何在单词 REGISTERS 之后开始正确读取值。
我试过的:
我环顾四周,并设法读取了一个只有一行的测试输入文件:“R5 11”。为此我做了:
fscanf(file_ptr, "R%d %d", ®Number, ®Value);
我打印了变量 regNumber、regValue,它们正确地给了我 5 和 11。但是对于单词 REGISTERS 之后的任意行数并在单词 MEMORY 处停止,我该如何做呢?
我假设无论解决方案是什么,我都可以做同样的事情来读取 MEMORY 位置和值。
解决方案
您可以使用 fgets() 读取文本文件的整行,然后使用 strcmp 或 strncmp 读取“REGISTERS”和“MEMORY”字符串文字的行。
您的 input.txt 的格式化方式在“REGISTERS”之后的所有内容都具有相同的格式,直到“MEMORY”,而“MEMORY”之后的所有内容都是相同的格式。尽管可能有更好的选择,但可能类似于以下内容会起作用:
int main () {
FILE *fp;
char str[60];
int input_type = 0; //you can enum this for the input types you have
int line_num = 0;
/* opening file for reading */
fp = fopen("input.txt" , "r");
if(fp == NULL) {
perror("Error opening file");
return(-1);
}
while( fgets (str, 60, fp)!=NULL ) { // dont really need the != NULL compare here.
line_num++;
/* Parse the next line in the file */
if(strcmp(str,"MEMORY") == 0){
//the next lines will be formatted like memory input lines
input_type = 2; //This should be an enum or macro
continue;
}
if(strcmp(str,"REGISTERS") == 0){
//the next lines will be formatted like register input lines
input_type = 1;//Also should be enum or macro
continue;
}
switch(input_type){
case 0:
fprintf(stderr,"Failed to find REGISTER keyword%d\n",line_num);
break;
case 1:
sscanf(str, "R%d %d", ®Number, ®Value); //parse known string format
do_something(®Number, ®Value);
break;
case 2:
sscanf(str, "%d %d", &memNumber, &memValue); //parse known string format
do_something_else(&memNumber, &memValue);
break;
default:
fprintf(stderr,"Could not find input format at line %d\n",line_num);
break;
}
}
fclose(fp);
return(0);
}
推荐阅读
- javascript - Electron 应用程序在透明模式下显示额外的边框
- ssh - 我应该为 SSH 输入什么密码?
- r - 为投资组合分析编写条件 If 语句
- ionic-framework - 在离子警报中显示 svg
- azure - Azure 自动化:Runbook:它知道它是 TenantID 吗?
- kubernetes - Kubernetes 是否需要最少数量的副本才能执行滚动部署?
- powershell - 大文件的 JSON 到 CSV 转换
- javascript - 使用 javascript 通过 html 表单发送 Base64 图像源代码
- javascript - React Native 如何使用 Lottie JSON 文件?
- javascript - 对于 Java Script 中的 2D 数组,如何找到 ALL indexOf 值?