ch = getc(lname);
while (ch != EOF)
{
ch = getc(lname);
if (ch == '\n')
temp++;
//except the line to be deleted
if (temp != delete_line)
{
//copy all lines in file replica.c
putc(ch, rep);
}
}
我有一个文件,其中包含以下数据
Aryan Verma
Vinayak Sharma
Dev Deol
Ameesh Deol
上面的代码基本上通过将行值放入delete_line来跳过了我想要的数据行。 在这里,temp初始化为1。现在的问题是,此代码正在跳过第一个字符,即本例中的“ A”,并将特殊字符“ putting”放在文件末尾。 例如,delete_line = 3
ryan Verma
Vinayak Sharma
Ameesh Deol
ÿ
此外,如果delete_line设置为1,则会跳过文件中的整行,例如:
Vinayak Sharma
Dev Deol
Ameesh Deol
ÿ
即使delete_line初始化为1,也请问是否有办法从文件的第一行进行写操作。
答案 0 :(得分:3)
您的代码正在跳过第一个字符,因为您已经在调用getc()
来读取第一个字母之后再次调用它。除了使用第一个字符来决定是否进入循环外,您没有对第一个字符进行任何操作,也没有在打印它。
您需要将对getc()
的第二次调用移动到循环主体的底部,而不是顶部:
ch = getc(lname);
while (ch != EOF)
{
// ch = getc(lname); <-- move this...
if (ch == '\n')
...
ch = getc(lname); // <-- ... down here instead
}
对于输出ÿ
的代码,这也是由于您第二次调用getc()
的位置错误。
ÿ
的数字值为0xFF
,当它被视为EOF
时,它与char
的值相同。在您打印完getc()
后,无论其值如何,您都不会在下一次循环迭代之前检查对ch
的第二次调用的返回值。
您的循环应如下所示:
ch = getc(lname);
while (ch != EOF)
{
if (ch == '\n')
temp++;
//except the line to be deleted
if (temp != delete_line)
{
//copy all lines in file replica.c
putc(ch, rep);
}
ch = getc(lname);
}
或者,也可以这样重写:
while ((ch = getc(lname)) != EOF)
{
if (ch == '\n')
temp++;
//except the line to be deleted
if (temp != delete_line)
{
//copy all lines in file replica.c
putc(ch, rep);
}
}
对于额外的换行符,这是因为您正在打印属于“已删除”行的'\n'
字符。当遇到'\n'
字符时,请先递增temp
,然后求值if (temp != delete_line)
来调用putc()
。当temp
等于delete_line
时,您将跳过putc()
,但是当到达'\n'
的{{1}}字符时,首先要递增delete_line
,使temp
的评估结果为true,因此您if (temp != delete_line)
为putc()
字符。您需要颠倒这种逻辑。
您的最终循环代码应更像这样:
'\n'