我对 C(以及这个网站)有些陌生,对我正在从事的项目有疑问。我坚持的部分是文件 I/O 的东西,因为我在上一节课中从未学过这部分。因此,输入 (.txt) 文件如下所示:
REGISTERS
R5 11
R7 15
R21 4
MEMORY
4 12
12 92
[OTHER STUFF]
该文件为我们提供了任意寄存器编号,然后是其内容(R0 到 31,省略了值为 0 的寄存器)。下一节以类似的格式给出了内存位置,然后是内容。然后是我稍后可以处理的更多部分。
我的问题是:如何读取寄存器/内存位置及其值?目前我有一个大小为 32 的数组来存储内容和一个用于寄存器编号和值的变量(示例: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);
}
关于c - 如何从文本文件 (C) 中读取特定数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50033017/