Estoy leyendo un archivo línea por línea, y la adición de cada línea en una cadena. Sin embargo, la longitud de la cadena aumenta en 1 por cada línea que yo creo que es debido al carácter de nueva línea. ¿Cómo puedo quitar de la copia.

Aquí está mi código de intento de hacer lo mismo.

if (inputFile.is_open())
{
    {
        string currentLine;
        while (!inputFile.eof())
            while( getline( inputFile, currentLine ) )
            {
                string s1=currentLine;
                cout<<s1.length();
            }

[Actualizado la Descripción] he utilizado el notepad++ para determinar la longitud de lo que estoy seleccionando línea por línea. Así que ellos están mostrando algunos 123, 450, 500, 120 para que mi programa muestra 124,451,501,120. A excepción de la última línea, toda la línea.longitud() muestra un aumento por valor de 1.

  • Bienvenido a StackOverflow. He formateado el código para usted. La primera de ellas gratis. Después de que usted tiene que comprar me una pinta 😉
  • std::getline() descarta el carácter de nueva línea. ¿Cómo se puede determinar la espera de longitud de la línea?
  • El uso de cout<<s1.length();
  • Que es la longitud de la línea de lectura por std::getline(), que parece ser diferente a lo que usted espera,
  • Quizás es un problema de la nueva línea en diferentes plattforms? De donde viene el archivo, en el que la plataforma de la que escribió su programa?
InformationsquelleAutor typedef1 | 2012-01-22

2 Comentarios

  1. 7

    Parece inputFile ha de estilo de Windows saltos de línea (CRLF), pero su programa es la división de la entrada en Unix-como saltos de línea (LF), porque std::getline(), se rompe en \n por defecto, dejando el CR (\r) al final de la cadena.

    Tendrás que recortar la extraña \rs. Aquí está una manera de hacerlo, junto con una pequeña prueba:

    #include <iostream>
    #include <sstream>
    #include <iomanip>
    
    void remove_carriage_return(std::string& line)
    {
        if (*line.rbegin() == '\r')
        {
            line.erase(line.length() - 1);
        }
    }
    
    void find_line_lengths(std::istream& inputFile, std::ostream& output)
    {
        std::string currentLine;
        while (std::getline(inputFile, currentLine))
        {
            remove_carriage_return(currentLine);
            output
                << "The current line is "
                << currentLine.length()
                << " characters long and ends with '0x"
                << std::setw(2) << std::setfill('0') << std::hex
                << static_cast<int>(*currentLine.rbegin())
                << "'"
                << std::endl;
        }
    }
    
    int main()
    {
        std::istringstream test_data(
            "\n"
            "1\n"
            "12\n"
            "123\n"
            "\r\n"
            "1\r\n"
            "12\r\n"
            "123\r\n"
            );
    
        find_line_lengths(test_data, std::cout);
    }

    De salida:

    The current line is 0 characters long and ends with '0x00'
    The current line is 1 characters long and ends with '0x31'
    The current line is 2 characters long and ends with '0x32'
    The current line is 3 characters long and ends with '0x33'
    The current line is 0 characters long and ends with '0x00'
    The current line is 1 characters long and ends with '0x31'
    The current line is 2 characters long and ends with '0x32'
    The current line is 3 characters long and ends with '0x33'

    Cosas a tener en cuenta:

    • No necesita de prueba para las expresiones del FOLCLORE. std::getline() devolverá el arroyo, que se echó a false cuando se puede leer no más de inputFile.
    • Usted no necesita una copia de un string para determinar su longitud.
    • he utilizado pnp++ para determinar la longitud de lo que estoy seleccionando línea por línea. Así que ellos están mostrando algunos 123, 450, 500, 120 para que mi programa muestra 124,451,501,120. A excepción de la última línea, toda la línea.longitud() muestra un aumento por valor de 1.
    • Puede ejecutar el programa en contra de un mucho más pequeño archivo de prueba de la línea de longitudes usted puede contar manualmente? ¿Qué informe para líneas de longitud cero? (Mina de informes 0)
    • Echarle un vistazo…
    • He actualizado mi respuesta, espero que esto ayude.
  2. 1

    Que porque estás en MS-Windows y agregar un «\r» antes de la «\n» y que «\r» no se quita.

    • Eso no es correcto, \r también se quita (stackoverflow.com/a/6089413/237483), pero es un problema, si el archivo se almacena en Windows y leer bajo Linux.
    • Me gustaría apostar grandes cantidades de dinero que este se el problema! Seguro que cuando la lectura de un archivo en modo texto en una máquina Windows, el final de la línea de secuencia es reemplazado por un \n que es despojado pero esta bonito invisible carácter al final de cada línea fácilmente la suciedad de las lecturas de seguridad. Es fácil verificar si este es el caso: if (!s.empty() && s.back() == '\r') { std::cout << "gotcha!\n"; }
    • sí he leído el archivo en unix .. almacenados en windows
    • Tal vez no para ti, pero para mí es un problema (Cliente = Windows, Server = Linux), y parece que en la OPs caso, este fue realmente el motivo.
    • En realidad, si se abre el archivo en modo binario (que probablemente no es el caso aquí…), a continuación, el \r\n no sería transformado ya sea en MS-Windows. Si getline() es lo suficientemente inteligente como para hacer ese trabajo, de todos modos, no estoy 100% seguro de que aunque.

Dejar respuesta

Please enter your comment!
Please enter your name here