У меня есть простая программа на 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");
Спасибо за ваш вклад!
@David Norman Я добавил полный исходный код - заранее спасибо за помощь.
Вы действительно просматривали это с помощью шестнадцатеричного редактора? ваш текстовый редактор может вас обмануть и всегда отображать пробелы
Кроме того, где вы печатаете числа?
Я запускал этот код с несколькими разными входными файлами, каждый с разным форматированием и т. д. Он всегда производит выходные данные без лишнего места в конце.
вам просто нужно изменить настройки gedit с "окончания строки Windows" на "окончания строки unix", и тогда он должен работать





Здесь требуется дополнительная информация, поскольку Тимхон спросил, в какой среде вы работаете? 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 для изменения фактического байтового содержимого вашего файла - в случае, если это просто редактор, создающий впечатление, что есть место.
Во-первых, приведенный вами пример кода не компилируется, поскольку 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.
Извините за ошибки объявления переменных, вы, ребята, отвечаете так быстро, что я не смог исправить это достаточно быстро, когда заметил ... :)
Я чувствую, что это даже близко не к этому, но если вы запустите это в Windows, вы получите \ r \ n как терминаторы строки, и, возможно, под * nix, в текстовом редакторе, не поддерживающем Windows, вы ' Я получу \ r как обычное пустое пространство, так как \ r не печатается.
В общем, лучший способ проверить это - использовать шестнадцатеричный редактор и увидеть файл самостоятельно.
Вы не разместили достаточно кода для диагностики проблемы. Где вы печатаете d?