c ++ fstream getline函数将 \r 添加到行大小

c++ fstream getline function adds \r to the line size

当我 运行 我在 Clion 上的代码时,我没有收到此错误。但是当我 运行 我的代码在我学校的开发服务器上时,我意识到除了下面文件中的最后一行之外的每一行大小都有一个大小 line.size()+1.

这是我的文件

6
5 8 2 5 6 7
5 4 7 3 2 1
2 5 3 4 7 5
6 5 8 7 2 3
6 4 3 1 1 2
2 7 8 2 1 6
2 1
1 2
2 4
4 0
5 3
2 2

它读取第一行大小为 2 等。它读取每行大小为大小 +1,除了最后一行。

这是我的代码。

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int num;
vector <vector <int> >board;
int points = 0;
int main(int argc, char **argv) {
    string file_name_2 ;
    vv << argv[2];
    vv >> file_name_2;
    stringstream vd;
fstream myFile;
    myFile.open(file_name_2, ios::in);
    if (myFile.is_open()) {
        string line;
        int index = 0;
        while(getline(myFile, line)){
            if (line.size()== 1 || line.size()==2 || line == "100"){
                stringstream zz;
                zz << line;
                zz >> num;
                .
                .
                .

我正在使用 getline(file_name, line) 来读取行。 是什么原因造成的,我该如何解决?

问题是由于文本文件没有 UNIX 样式的行结尾 ("\n"),而是具有 Windows 样式的行结尾 ("\r\n")。

在 Windows 上,当以文本模式打开文件时(没有 ios::binary),"\r\n" 行结尾会自动转换为 "\n" 行结尾。在 Linux 上,这种转换是不必要的,因为它们应该首先存储为 "\n"。因此,在Linux上,以文本模式或二进制模式打开文件没有区别,因为在这两种情况下,都不会执行转换。

但是,将带有 Windows 样式行尾的文本文件上传到 Linux 服务器上可能会引起麻烦。如上所述,在Linux上,以文本模式打开文件时,"\r\n"行尾不会自动转换为"\n"行尾,因为在Linux上,文本文件预计已经有 "\n" 行结尾。这可能就是为什么当 运行 您的程序在 Linux 服务器上时 getline 读取一个额外字节的原因。

Windows 上的大多数文本编辑器 运行 创建 Windows 样式的行结尾。但是,一些高级文本编辑器还允许您使用 UNIX 样式的行结尾保存文件。此外,一些数据传输程序允许您在数据传输过程中转换文件。

为了将文本文件从 Windows 样式的行结尾转换为 UNIX 样式的行结尾,您可以使用 dos2unix or sed 等程序。您也可以自己轻松编写这样的程序,因为该程序除了删除所有回车 return ('\r') 字符外什么都不做:

#include <stdio.h>

int main(void)
{
    int c;

    while ( ( c = getchar() ) != EOF )
        if ( c != '\r' )
            putchar( c );
}