Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在打印一行文件时光标移到下一行?_C_File_Io_Cursor_Printf - Fatal编程技术网

C 为什么在打印一行文件时光标移到下一行?

C 为什么在打印一行文件时光标移到下一行?,c,file,io,cursor,printf,C,File,Io,Cursor,Printf,我有下面的C程序来打印文件的内容并计算其中的字符总数 #include<stdio.h> #include<stdlib.h> int main() { /*Declaring a FILE pointer fp.*/ FILE *fp; char ch; int noc = 0; /*Using fopen() to get the address of the FILE structure, and store it in

我有下面的C程序来打印文件的内容并计算其中的字符总数

#include<stdio.h>
#include<stdlib.h>

int main()
{
    /*Declaring a FILE pointer fp.*/
    FILE *fp;
    char ch;
    int noc = 0;

    /*Using fopen() to get the address of the FILE structure, and store it in fp*/
    fp = fopen("poem.txt","r");
    if (fp == NULL)
    {
            printf("Error opening file");
            exit(1);
    }
    while(1)
    {
            ch = fgetc(fp);
            if (ch == EOF) /* EOF will be there at the end of the file.*/
                    break;
            noc++;
            printf("%c",ch); /* Printing the content of the file character by character*/
    }

    //printf("\n");

    close(fp); /* We need to fclose() the fp, because we have fopen()ed */

    printf("\tNumber of characters: %d\n",noc);

    return 0;
}

/*One interesting observation: There is an extra new line printed. Why ???*/
你可以看到wc证实了这一点(但是我仍然不明白为什么wc给出的字符数是24,而不是23)

下面是这个程序的输出。

-bash-4.1$./a.out
从结尾开始。
此文件中的字符数:24
-bash-4.1$
您可以看到,在打印文件的所有字符后,光标会移到下一行,即使在打印文件的所有字符后,我已经对printf(“\n”)进行了注释

为什么光标被移到新行?在打印文件的所有字符后,我希望光标位于同一行,因此在下一个printf中使用了\t

您还可以看到,我的程序说字符数是24(这与“wc poem.txt”输出是内联的)

所以我很困惑,为什么在打印文件的最后一个字符后,光标会移到新行?另外,为什么字符总数(noc)是24而不是23

另外,虽然我对“wc”所显示的字符数有相同的问题,但您可以忽略“wc”输出,除非是行数。我可能会就此提出下一个问题

谢谢

为什么光标被移到新行

  • 因为
    '\n'
    字符在文件中
您还可以看到,我的程序说字符数是24(这与“wc poem.txt”输出是内联的)

  • 因为打印的23个字符加上
    '\n'
    都在文件中
您可以尝试对空白字符进行转义以查看它们,因为它们是不可见的,所以如下所示

while ((ch = fgetc(fp)) != EOF)
{
    noc++;
    if (isspace(ch) != 0)
        printf("\\%02X", ch);
    else
        printf("%c", ch);
}
这样,您将看到每个字符,您需要包括


注意:只有在非常特殊的情况下才需要使用
break
,我不喜欢它,因为它很难遵循程序流程。

将每个字符打印为ascii值,然后查看最后一个字符的代码:)(使用
printf(“%d”,ch);
)@JanLegner Yea我这样做了,它打印了24个数字(令我惊讶的是),最后一个数字是10(换行)。但是为什么在编写此文件时没有按ENTER键出现这一新行呢?它只有一行!!!您不能保证您的文本编辑器没有在文件末尾添加任何新行…请尝试使用
echo创建它,它从结尾开始。>outputFile.txt
echo-n它从结尾开始。>outputFile.txt
和见difference@JanLegner哦,所以vi最后添加了\n。我在vi编辑器中键入了这一行。我尝试了这两个echo和echo-n,现在我看到了区别。接下来我将使用C程序创建一个文件,而不放置任何\n。希望我的疑问届时会消除。我将在此处更新。@JanLegner确认!!vi编辑器正在添加新行。我创建了一个file使用C程序并在其中输入no\n。现在上面的“wc”和我的程序都没有显示新行。非常感谢。是的,我按照你的建议做了,它打印了24个1。但基本上这正是我的问题。这个\n来自哪里(第24个字符)?看起来vi编辑器正在添加\n。也感谢您建议更小心地使用break。接下来我将使用C代码创建一个文件,但不放任何\n。然后我想我所有的疑问都会消除。已确认!!vi编辑器正在添加新行。我使用C程序创建了一个文件,但没有放任何\n在其中。现在都是“wc”我上面的节目没有新台词,谢谢。