我一直试图在VS2017上运行此代码。该代码正在编译并运行,但是不是我想要的那样。因此,我尝试使用调试器,它说:
调试断言失败! 程序:
文件:minkernel \ crts \ ucrt \ src \ appcrt \ stdio \ fgets.cpp
第33行
表达式:stream.valid()
从过去的问题中,我知道它可能是由于错误地打开文件而发生的,但是我认为我的代码确实可以解决这个问题。
任何帮助将不胜感激!
(我的相关代码):
int main(int argc, char *argv[]) {
int i, count_commands, PC_A, lastLine;
int *PC = &PC_A;
FILE *memin;
FILE *memout;
FILE *regout;
FILE *trace;
FILE *count;
assert(argc == 6);
*PC = 0;
count_commands = 0;
//allocationg memory for registers content
char **regs = (char **)(malloc(sizeof(char *) * 16));
for (i = 0; i < 16; i++) {
regs[i] = (char *)(malloc(sizeof(char) * 9));
for (int j = 0; j < 8; j++) {
regs[i][j] = '0';
}
regs[i][8] = '\0';
}
//allocationg memory for the memory image we have
char **memory = (char **)(malloc(sizeof(char *) * 4096));
for (i = 0; i < 4096; i++) {
memory[i] = (char *)(malloc(sizeof(char) * 9));
memory[i][0] = '\0';
}
//load memin image into memory
char *line = (char *)malloc(sizeof(char) * 8);
memin = fopen(argv[1], "r");
if (memin != NULL) {
perror(strerror(errno));
}
int j = 0;
while ((line = fgets(line, 10, (FILE *)memin)) != NULL) {
strcpy(memory[j], line);
memory[j][8] = '\0';
j++;
}
答案 0 :(得分:0)
打开文件后,在OP的代码中进行以下检查:
if (memin != NULL) {
perror(strerror(errno));
}
因此,如果开头成功,则会显示错误字符串。在我的实施中,它报告:
Success: Success
打开文件失败 不会采取任何措施。
当涉及到文件中所有行的实际读取时,还有其他一些问题。分配了大小为 8 的名为char
的缓冲区(line
数组)并将其传递给fgets
:
while ((line = fgets(line, 10, (FILE *)memin)) != NULL) {
// ^^
请注意,还会传递 10 作为缓冲区的大小,这是错误的,因为它允许fgets
写入已分配数组的边界。
此外,鉴于OP的编译器是MSVC 2017,我假设此代码在Windows上运行,因此,在文件中,行有可能以"\r\n"
序列终止,而不是单个{{1} }。即使OP确信每一行都是8个字符的字符串,'\n'
也需要至少 大小8 + 3(8 +'\ r'+'\ n'+' \ 0')以安全地阅读它们。
考虑如何在这些代码片段中实现这些建议:
fgets