感到愚蠢地问这个问题,因为这应该很容易,但我无法弄清楚什么是错的。
void loadIniIntoMemory() {
FILE *fp ;
fp = fopen (iniFile, "r");
int ch;
int final_line_num = 0;
int char_index;
char* current_line = (char*) malloc(sizeof(char) * MAX_INI_LINE_LENGTH);
while((ch = fgetc(fp)) != EOF) {
if(ch == 10) {
// new line
*(current_line + char_index) = '\0';
char_index = 0;
iniFileData[final_line_num] = current_line;
final_line_num++;
} else {
// regular char
*(current_line + char_index) = ch; // CAN'T DO THIS, CRASH
char_index++;
if(ch == 13) {
// carriage return
continue;
}
}
}
}
自从我做了C之后不久,它在这一行崩溃了:*(current_line + char_index) = ch;
感谢您的帮助。
- 编辑 -
此外,没有人注意到,此代码不保存最后一行。这是完整,正确,有效的代码,它将文件保存到指针数组中。
void loadIniIntoMemory() {
FILE *fp ;
fp = fopen (iniFile, "r");
int ch;
final_line_num = 0;
int char_index = 0;
char* current_line = (char*) malloc(sizeof(char) * MAX_INI_LINE_LENGTH);
while((ch = fgetc(fp)) != EOF) {
if(ch == '\n') {
// new line
*(current_line + char_index) = '\0';
char_index = 0;
iniFileData[final_line_num] = current_line;
final_line_num++;
current_line = (char*) malloc(sizeof(char) * MAX_INI_LINE_LENGTH);
} else if(ch != '\r') {
// regular char
*(current_line + char_index) = ch;
char_index++;
}
}
iniFileData[final_line_num] = current_line;
fclose(fp);
}
答案 0 :(得分:3)
对于初学者,你没有初始化char_index
,这意味着它可能会有垃圾。如果您没有初始化它,您的程序将向current_line
指针添加一些未知数字。
int char_index = 0; /* initialize to 0 */
其次,更自然的语法是:
current_line[char_index] = ...
第三,您可以在不使用整数等值的情况下测试字符:
if (ch == '\n') {
/* this is the same as "ch == 10" */
第四,你应该在离开例程之前关闭打开的文件:
fclose(fp);
最后,我不确定ch == 13
('\r'
)和continue
应该处理什么,因为continue
实际上是无操作,但是您可能不想将其复制到数据中:
if (ch != '\r') {
current_line[char_index] = ch;
char_index++;
/* or on one line: current_line[char_index++] = ch; */
}
顺便说一句,C(和许多其他语言)的强大功能是switch
语句:
/* substitutes your if...elseif...else */
switch (ch) {
case '\n':
current_line[char_index] = '\0';
char_index = 0;
iniFileData[final_line_num++] = current_line;
break; /* <-- very important, C allows switch cases to fall thru */
case '\r':
/* do nothing */
break;
default:
/* any character that is not a newline or linefeed */
current_line[char_index++] = ch;
break;
}
答案 1 :(得分:2)
您没有初始化char_index
。我想你想把它初始化为0.在C中,未初始化的变量将包含垃圾。很可能你的char_index
等于一些非常大的数字。
答案 2 :(得分:2)
除了其他人已经指出的内容之外,您还必须在final_line_num++;
语句之后立即将行缓冲区分配调用移动到循环中。否则,您读取的每一行都将覆盖上一行。
答案 3 :(得分:0)
某些操作系统,如大多数符合POSIX标准的操作系统,特别是Linux,使您能够将文件段(可能是整个文件)映射到虚拟内存中。在Linux上,您可以考虑使用mmap system call