Printf ("something \ n") выводит "something" (дополнительное пространство) (g ++ / linux / чтение выходного файла с помощью gedit)

У меня есть простая программа на C++, которая читает stdin с помощью scanf и возвращает результаты в stdout с помощью printf:


#include <iostream>
using namespace std;

int main()
{
    int n, x;
    int f=0, s=0, t=0;

    scanf("%d",&n); scanf("%d",&x);

    for(int index=0; index<n; index++)
    {
        scanf("%d",&f);
        scanf("%d",&s);
        scanf("%d",&t);

        if (x < f)
        {
            printf("first\n");
        }
        else if (x<s)
        {
            printf("second\n");
        }
        else if (x<t)
        {
            printf("third\n");
        }
        else
        {
            printf("empty\n");
        }
    }

    return 0;
}

Я компилирую с g ++ и работаю под Linux. Я выполняю программу, используя текстовый файл в качестве ввода, и передаю вывод в другой текстовый файл следующим образом:

program < in.txt > out.txt

Проблема в том, что out.txt выглядит так:

result1_
result2_
result3_
...

Где «_» - это дополнительный пробел в конце каждой строки. Я просматриваю out.txt в gedit.

Как я могу производить вывод без дополнительного места?

Мой входной файл выглядит так:

2 123
123 123 123
123 234 212

Редактировать: Мне удалось найти способ решения этой проблемы: printf("\rfoo"); Спасибо за ваш вклад!

Вы не разместили достаточно кода для диагностики проблемы. Где вы печатаете d?

David Norman 09.12.2008 00:17

@David Norman Я добавил полный исходный код - заранее спасибо за помощь.

Kamil Zadora 09.12.2008 00:25

Вы действительно просматривали это с помощью шестнадцатеричного редактора? ваш текстовый редактор может вас обмануть и всегда отображать пробелы

Johannes Schaub - litb 09.12.2008 00:30

Кроме того, где вы печатаете числа?

Nathan Fellman 09.12.2008 00:30

Я запускал этот код с несколькими разными входными файлами, каждый с разным форматированием и т. д. Он всегда производит выходные данные без лишнего места в конце.

e.James 09.12.2008 00:40

вам просто нужно изменить настройки gedit с "окончания строки Windows" на "окончания строки unix", и тогда он должен работать

Johannes Schaub - litb 09.12.2008 01:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
4 801
8

Ответы 8

Здесь требуется дополнительная информация, поскольку Тимхон спросил, в какой среде вы работаете? Linux, Windows, Mac? Кроме того, какой текстовый редактор вы используете для отображения этих лишних пробелов?

Я предполагаю, что ваше пространство на самом деле не является пространством. Запустить

od -hc out.txt

чтобы дважды проверить, действительно ли это пробел.

Символы конца строки:

System  Hex     Value   Type
Mac     0D      13      CR
DOS     0D 0A   13 10   CR LF
Unix    0A      10      LF 

Для завершения очереди в каждой системе вы можете:

printf("%c", 13);
printf("%c%c", 13, 10);
printf("%c", 10);

Вы можете использовать это как

printf("empty");
printf("%c", 10);

Википедия Новая строка статьи здесь.

Попробуйте удалить '\ n' из операторов printf() и снова запустите код. Если выходной файл выглядит как одно длинное слово (без пробелов), то вы знаете, что единственное, что вставляется после текста, - это '\ n'.

Я предполагаю, что редактор, который вы используете для чтения файла out.txt, просто делает его смотрю, как будто после вывода есть лишнее пространство.

Если вы все еще не уверены, вы можете написать быструю программу для чтения out.txt и определения ASCII-кода каждого символа.

Поскольку вы используете Linux, вы можете использовать bvim для изменения фактического байтового содержимого вашего файла - в случае, если это просто редактор, создающий впечатление, что есть место.

Peter Howe 09.12.2008 00:59

Во-первых, приведенный вами пример кода не компилируется, поскольку o и d не определены ...

Во-вторых, у вас, вероятно, есть пробел в конце строки, которую вы читаете из входного файла. Попробуйте открыть его в vi, чтобы увидеть. В противном случае вы можете вызвать функцию обрезки для каждой строки перед выводом и покончить с этим.

Удачи!

Убедитесь, что вы смотрите на результат ожидаемой программы; у этого есть синтаксическая ошибка (нет ";" после int n).

Хорошо, это немного сложно понять, поскольку в программе-примере есть множество ошибок:

g++ -o example example.cc
example.cc: In function 'int main()':
example.cc:19: error: 'k' was not declared in this scope
example.cc:22: error: 'o' was not declared in this scope
example.cc:24: error: 'd' was not declared in this scope
make: *** [example] Error 1

Но это не будет ваш входной файл; ваш scanf будет загружать все, что вы набираете, в int. Но вот этот пример:

/* scan -- try scanf */
#include <stdio.h>

int main(){
    int n ;
    (void) scanf("%d",&n);
    printf("%d\n", n);
    return 0;
}

произвел такой результат:

bash $ ./scan | od -c
42
0000000    4   2  \n                                                    
0000003

в Mac OS / X. Получите нам копию кода, который вы действительно выполняете, и результаты od -c.

Извините за ошибки объявления переменных, вы, ребята, отвечаете так быстро, что я не смог исправить это достаточно быстро, когда заметил ... :)

Kamil Zadora 09.12.2008 01:11

Я чувствую, что это даже близко не к этому, но если вы запустите это в Windows, вы получите \ r \ n как терминаторы строки, и, возможно, под * nix, в текстовом редакторе, не поддерживающем Windows, вы ' Я получу \ r как обычное пустое пространство, так как \ r не печатается.

В общем, лучший способ проверить это - использовать шестнадцатеричный редактор и увидеть файл самостоятельно.

Другие вопросы по теме