【发布时间】:2019-06-21 03:33:47
【问题描述】:
我是 C 新手,这是我的第一个项目,并且一直在自学。在我的程序中,我的一个函数需要从文件中读取一行,并将其存储在一个 char 数组中。当我使用 gdb 跟踪程序时,数组 (line[]) 只是零。这导致我的程序返回错误“错误:资产文件中的一行缺少':'分隔符\n” 这是我的代码:
//return the line number (0 based) that the cmd is on, -1 if absent
int locateCmd(char cmd[]) {
int lineIndex = -1; //-1, because lineIndex is incramented before the posible return
char cmdTemp[10] = "\0";
//create a compareable cmd with correct cmd that has its remaining values zeroed out
char cmdCmp[10] = "\0";
memset(cmdCmp, 0, sizeof(cmdCmp));
for (int i = 0; i < strlen(cmd); i++) {
cmdCmp[i] = cmd[i];
}
FILE *file = fopen(ASSET_FILE, "r");
//loop until target line is reached
while (strcmp(cmdTemp, cmdCmp) != 0) {
//check if last line is read
if (lineIndex == lineCounter(file)-1) {
return -1;
}
memset(cmdTemp, 0, sizeof(cmdTemp));
char line[61];
fgets(line, 61, file);
//set cmdTemp to the command on current line
lineIndex++;
for (int i = 0; line[i] != ':'; i++) {
cmdTemp[i] = line[i];
//return error if line doesn't contain a ':'
if (line[i] = '\n') {
printf("Error: a line in the asset file lacks a ':' separator\n");
exit(1);
}
}
}
return lineIndex;
}
一些上下文,这个函数被传递了一个命令,它的工作是读取一个看起来像这样的文档:
command:aBunchOfInfoOnTheComand
anotherCommand:aBunchOfInfoOnTheComand
并选择存储传递的命令 (cmd[]) 的行。
问题在于第 24 行的 fget。我已将此代码的相关部分分离到一个较小的测试程序中,它工作正常。 有效的测试程序是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[]) {
FILE *file = fopen("tutorInfo.txt", "r");
char line[61];
fgets(line, 61, file);
printf("%s\n", line);
}
我的测试程序的正确执行让我相信我的函数中的其他代码导致了这个问题,但我不确定是什么。需要注意的是,有问题的代码与我的示例程序具有相同的导入。任何帮助将不胜感激。
【问题讨论】:
-
如果该行不包含
:,您的循环将超出范围。您还需要制作一个显示问题的小型测试程序(不是一个可以正常工作的程序) -
在第一个代码中,循环永远不会退出(循环条件使用你永远不会更新的外部
cmdTemp) -
linecounter(FILE *)的代码在哪里?如果您所做的只是在函数本身中打开文件而不返回FILE *,那么将FILE *file传递给locateCmd()的目的是什么? -
@M.M 我会发布一个小测试程序,如果我有这个程序就不能工作,但是当我试图让它工作时。
-
@M.M 我明白你对 cmdTemp 的意思,我忽略了它们具有不同指针的事实,即使它们具有相同的名称。有没有一种重置字符串的好方法,所以我不必给它一个新的指针。一个 for 循环将所有值设置为“\ 0”,也许?谢谢。