为什么 cin 语句中打印空格时,第 0 个字符没有打印出来?

问题描述 投票:0回答:1

我正在从文本文件中读取一行,并使用 for 循环打印该行中的每个字符。为什么

0
行的第
p
个字符没有被打印?

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    const int max_length = 100; // Adjust this based on your text size
    char line1[max_length];
    
    freopen("input2.txt", "r", stdin);
    cin.getline(line1, max_length);
    
    for (int i = 0; line1[i] != '\0'; i++)
       cout<<line1[i]<<" "; 

    cout << "\n";
    for (int i = 0; line1[i] != '\0'; i++)
       cout<<line1[i];      

    cout << "\n";
    fclose(stdin);
    
    return 0;
}

在文件中输入:

pqrstuwvx

输出:

  q r s t u w v x 
 pqrstuwvx

但是,如果我以这种方式编写

cout
语句
cout<<line1[i];
,它会给出正确的输出。请解释一下原因。

c++ file-io file-handling
1个回答
2
投票

@Deba 在我看来,这个问题与使用

freopen
将标准输入 (
stdin
) 重定向到文件有关。

当您使用

cin.getline
读取一行时,它会将换行符 (
'\n'
) 留在输入缓冲区中。因此,当您开始使用
for
循环打印字符时,遇到的第一个字符是换行符,这就是为什么您看不到正在打印的
p

为了解决此问题,我尝试在从文件中读取该行后添加对

cin.ignore
的额外调用。这是修改后的代码:

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    const int max_length = 100; // Adjust this based on your text size
    char line1[max_length];
    
    freopen("index2.txt", "r", stdin);
    cin.getline(line1, max_length);

    // Add this line to consume the newline character
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
    for (int i = 0; line1[i] != '\0'; i++)
       cout << line1[i] << " "; 

    cout << "\n";
    for (int i = 0; line1[i] != '\0'; i++)
       cout << line1[i];      

    cout << "\n";
    fclose(stdin);
    
    return 0;
}

希望对您的理解有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.