为什么此代码会跳过第一个字符并在文件末尾打印一个特殊字符
Why is this code skipping the first character and printing a special character at the end of the file
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",并在文件末尾放置一个特殊字符“ÿ”。
例如,delete_line=3
ryan Verma
Vinayak Sharma
Ameesh Deol
ÿ
此外,如果 delete_line 被初始化为 1,它会跳过文件中的整行,例如:
Vinayak Sharma
Dev Deol
Ameesh Deol
ÿ
即使 delete_line 初始化为 1,如果有办法从文件的第一行写入,请告诉我。
您的代码跳过了第一个字符,因为您在调用 getc()
读取第一个字母后再次调用它。除了使用它来决定是否进入循环之外,您没有对第一个字符做任何事情,您没有打印它。
您需要将对 getc()
的第二次调用移动到循环体的底部,而不是在顶部:
ch = getc(lname);
while (ch != EOF)
{
// ch = getc(lname); <-- move this...
if (ch == '\n')
...
ch = getc(lname); // <-- ... down here instead
}
至于打印出来的代码ÿ
,也是因为你第二次调用getc()
的地方不对。
ÿ
的数值为 0xFF
,当它被视为 char
时,它与 EOF
的数值相同。在您已经打印 ch
之后,无论其值如何,您都不会检查第二次调用 getc()
的 return 值,直到下一次循环迭代。
您的循环应该更像这样:
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);
}
}
至于额外的换行符,那是因为你正在打印属于"deleted"行的'\n'
字符。当遇到'\n'
字符时,先自增temp
,然后计算if (temp != delete_line)
调用putc()
。当temp
等于delete_line
时,你跳过putc()
,但是当你到达delete_line
的'\n'
字符时,你先增加temp
,使 if (temp != delete_line)
评估为真,因此您 putc()
是 '\n'
字符。你需要扭转这个逻辑。
您的最终循环代码应该看起来更像这样:
while ((ch = getc(lname)) != EOF)
{
// copy all lines in file replica.c
// except the line to be deleted
if (temp != delete_line)
{
putc(ch, rep);
}
if (ch == '\n')
temp++;
}
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",并在文件末尾放置一个特殊字符“ÿ”。 例如,delete_line=3
ryan Verma
Vinayak Sharma
Ameesh Deol
ÿ
此外,如果 delete_line 被初始化为 1,它会跳过文件中的整行,例如:
Vinayak Sharma
Dev Deol
Ameesh Deol
ÿ
即使 delete_line 初始化为 1,如果有办法从文件的第一行写入,请告诉我。
您的代码跳过了第一个字符,因为您在调用 getc()
读取第一个字母后再次调用它。除了使用它来决定是否进入循环之外,您没有对第一个字符做任何事情,您没有打印它。
您需要将对 getc()
的第二次调用移动到循环体的底部,而不是在顶部:
ch = getc(lname);
while (ch != EOF)
{
// ch = getc(lname); <-- move this...
if (ch == '\n')
...
ch = getc(lname); // <-- ... down here instead
}
至于打印出来的代码ÿ
,也是因为你第二次调用getc()
的地方不对。
ÿ
的数值为 0xFF
,当它被视为 char
时,它与 EOF
的数值相同。在您已经打印 ch
之后,无论其值如何,您都不会检查第二次调用 getc()
的 return 值,直到下一次循环迭代。
您的循环应该更像这样:
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);
}
}
至于额外的换行符,那是因为你正在打印属于"deleted"行的'\n'
字符。当遇到'\n'
字符时,先自增temp
,然后计算if (temp != delete_line)
调用putc()
。当temp
等于delete_line
时,你跳过putc()
,但是当你到达delete_line
的'\n'
字符时,你先增加temp
,使 if (temp != delete_line)
评估为真,因此您 putc()
是 '\n'
字符。你需要扭转这个逻辑。
您的最终循环代码应该看起来更像这样:
while ((ch = getc(lname)) != EOF)
{
// copy all lines in file replica.c
// except the line to be deleted
if (temp != delete_line)
{
putc(ch, rep);
}
if (ch == '\n')
temp++;
}