我需要以这种格式读入输入文件:
REGISTERS
R1 4
R7 12
MEMORY
8 19
16 25
NEXT SECTION...
其中“R1 4”表示寄存器1的值为4,或者存储单元8的值为19.我在每个中使用了2行,但可以提供任意数量的寄存器和存储单元。对于我的项目的第一部分,我需要读入输入文件并用适当的值填充我的数组(例如寄存器[1] = 4)。这就是我到目前为止所做的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int parseFile(FILE *filePtr, int *registers, int *memory);
void parseRegisters(const char *line, int *registers);
void parseMemory(const char *line, int *memory);
void main() {
int Registers[32];
int Memory[1000];
int returnVal;
FILE* fileIn;
fileIn = fopen("input.txt", "r");
if (fileIn == NULL) {
printf("Unable to find input file\n");
return;
}
returnVal = parseFile(fileIn, Registers, Memory);
fclose(fileIn);
}
int parseFile(FILE *filePtr, int *registers, int *memory) {
if (filePtr == NULL) {
return 0;
}
char line[64];
int mode = 0;
while (fgets(line, sizeof line, filePtr) != NULL) {
if (strcmp(line, "REGISTERS\n") == 0) {
mode = 1;
continue;
}
else if (strcmp(line, "MEMORY\n") == 0) {
mode = 2;
continue;
}
else {
continue;
}
switch (mode) {
case 1:
parseRegisters(line, registers);
break;
case 2:
parseMemory(line, memory);
break;
case 0: //will come back later for sections after MEMORY
break;
default:
break;
}
}
return 1;
}
void parseRegisters(const char *line, int *registers) {
int regNum, regVal;
printf("test");
if (sscanf(line, "R%d %d", ®Num, ®Val) != 2)
{
printf("Invalid format for REGISTER section\n");
return;
}
registers[regNum] = regVal;
printf("%d %d", regNum, regVal); //was using to test if variables correctly set
return;
}
void parseMemory(const char *line, int *memory) {
int memLoc, memVal;
if (sscanf(line, "%d %d", &memLoc, &memVal) != 2) {
printf("Invalid format for MEMORY section\n");
return;
}
memory[memLoc] = memVal;
return;
}
此代码未在后面的部分中完成,但我一直在测试“寄存器”部分无济于事。当我运行代码时,“模式”被正确更新,但我不认为parseRegisters()甚至执行,因为我留在那里的printf()语句来测试它不会打印任何东西。我也尝试在main中打印整个Registers []数组,看看它是否填满了,但它仍然是空的。
答案 0 :(得分:0)
是的确看起来你的函数parseRegisters似乎不会被调用。
这是因为你的继续&#34;第一个开关结构内的键盘工作。
正如您在此处所见:https://msdn.microsoft.com/en-us/library/0ceyyskb.aspx, &#34;继续&#34;将使你的while循环进入下一次迭代。因此,如果您获得REGISTERS或MEMORY字样,您永远不会到达第二个开关结构。
尝试删除&#34;继续&#34;关键字,所以while循环内的迭代将继续,并检查它是否更好。
更常见的是,当你有代码时,尝试使用纸张一行一行地执行它,看看会发生什么。如果有一些你不知道的东西(关键字,功能......)尽可能多地谷歌,看看其他例子。如果经过严肃的谷歌搜索后你不明白,那么Stack Overflow就在你身边!
答案 1 :(得分:0)
...&#34;我不认为parseRegisters()甚至会执行#34; ....
首先,您应该使用断点逐步完成代码,然后您可以确定代码是否会被执行。
其次,确保文件路径正确。在您的情况下,文件必须位于您的* .exe所在的文件夹中。
第三,继续意味着你跳过它下面的代码并再次启动循环。 - &GT;删除它们......