【问题标题】:c++ fstream getline function adds \r to the line size [duplicate]c ++ fstream getline函数将\ r添加到行大小[重复]
【发布时间】:2021-11-07 00:42:23
【问题描述】:

当我在 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) 来读取行。 这是什么原因造成的,我该如何解决?

【问题讨论】:

  • 请提供一个minimal reproducible example,其中包括一个函数main和所有#include指令。
  • 您是否正在将此文件从 Windows 移动到 Linux?
  • @Yksisarvinen 我使用 Windows 没有问题,然后在我大学的开发服务器上运行它并遇到了这个问题,但我实际上不知道它是什么开发服务器。
  • 您如何将文本文件上传到大学的服务器?您可以选择以文本模式而不是二进制模式上传吗?如果你这样做,那么你应该使用该选项。如果你没有那个选项,你可以在大学的服务器上运行dos2unix 命令吗?
  • 调试它的下一步是打印长度不是您期望的行的实际内容。打印每个字符,以便不遗漏不可见的字符并从那里开始。

标签: c++ file-io file-read


【解决方案1】:

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

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

但是,将带有 Windows 样式行结尾的文本文件上传到 Linux 服务器上可能会导致问题。如上所述,在 Linux 上,以文本模式打开文件时,"\r\n" 行尾不会自动转换为 "\n" 行尾,因为在 Linux 上,文本文件应该已经有 "\n" 行尾。这可能是您说getline 在Linux 服务器上运行程序时读取额外字节的原因。

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

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

#include <stdio.h>

int main(void)
{
    int c;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多