我一直在玩C (刚刚开始(,并且我正在尝试制作一个需要一个函数来计数C 中的线路的程序。但是,我遇到了正常分配不起作用的怪异行为,但是通过地址进行分配,然后立即解雇。这样:
int countLinesInFile(string fileName){
char c[32];
int numLines = 0;
ifstream file(fileName);
while(file >> c){
numLines += 1;
cout << "Lines: " << numLines << endl;
}
return numLines;
}
导致:
Lines: 1
Lines: 1
Lines: 1
Lines: 1
Lines: 1
Lines: 1
但是,当我将numLines += 1
更改为*(&numLines) += 1
时,它神奇地有效:
Lines: 1
Lines: 2
Lines: 3
Lines: 4
Lines: 5
Lines: 6
对于少量背景,我要读的文件是一个6行文件,其中每行都是32位二进制字符串(等于零(。当我打印出C(使用cout << c
(时,它似乎正确打印出来。另外,我知道这可能不是从文件中读取行的最佳或正确的方法,但是除非这根本无法使用,否则我对这种行为为什么会发生的基本机制和我的兴趣更感兴趣我做错了。
' '
字符二进制值是 00000000
。我猜numLines
就在您的数组c
之后,并且在记忆中始终被零擦除,然后被1递增。因此,它始终显示为1。
当您编译第二版时,必须将内存组织另一种方式(只有编译器知道,如果您在非常低的级别调试(,这不会影响numLines
值。
好吧,这是答案。正如讲故事的人所说,数组必须长33个字符,以捕获终止字符并防止异常行为。
P.S。感谢您的所有有用的评论,我同意Getline可能是更好的选择。如果有人对这种溢出可能导致这种怪异的行为有任何洞察力。
与API std::getline
使用类std::string
,您可以在每个读取时读取一条整行,并在每个读取计数器变量时进行递增:
std::string sLine;
std::ifstream in("main.cpp");
int nLines = 0;
while(std::getline(in, sLine))
++nLines;
std::cout << nLines << endl;
in.close();