Как о чем-то вроде этого:
import os
def readlines_reverse(filename):
with open(filename) as qfile:
qfile.seek(0, os.SEEK_END)
position = qfile.tell()
line = ''
while position >= 0:
qfile.seek(position)
next_char = qfile.read(1)
if next_char == "\n":
yield line[::-1]
line = ''
else:
line += next_char
position -= 1
yield line[::-1]
if __name__ == '__main__':
for qline in readlines_reverse(raw_input()):
print qline
Поскольку файл читается символом по символу в обратном порядке, он будет работать даже на очень больших файлах, если отдельные строки вписываются в память.
Я нашел ответ на свой собственный вопрос путем нахождения более совместимой реализации stdbool.h
, который совместим со стандартом C99.
#ifndef _STDBOOL_H
#define _STDBOOL_H
#include <stdint.h>
/* C99 Boolean types for compilers without C99 support */
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */
#if !defined(__cplusplus)
#if !defined(__GNUC__)
/* _Bool builtin type is included in GCC */
/* ISO C Standard: 5.2.5 An object declared as
type _Bool is large enough to store
the values 0 and 1. */
/* We choose 8 bit to match C++ */
/* It must also promote to integer */
typedef int8_t _Bool;
#endif
/* ISO C Standard: 7.16 Boolean type */
#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1
#endif
#endif
Это взято от Библиотека классов Ada проект.
Размер не является единственной вещью, которая будет непоследовательна здесь. В C++ bool является ключевым словом, и C++ гарантирует, что bool может содержать значение или 1 или 0 и ничто иное. C не дает Вам эту гарантию.
Тем не менее, если совместимость между C и C++ важна, можно эмулировать C изготовленная на заказ булевская переменная путем определения идентичной для C++ и использования этого вместо встроенного bool. Это будет компромиссом между ошибочным булевым и идентичным поведением между булевской переменной C и булевской переменной C++.
Логически, Вы не в состоянии совместно использовать исходный код между C и C++ с конфликтующими объявлениями для bool и сделать, чтобы они связались друг с другом.
единственный способ, которым можно совместно использовать код и ссылку, через посреднический datastructure. К сожалению, от того, что я понимаю, Вы не можете изменить код, который определяет интерфейс между Вашей программой C++ и библиотекой C. Если бы Вы могли, я предложить использовать что-то как:
union boolean {
bool value_cpp;
int value_c;
};
//дополнение может быть необходимым в зависимости от порядок байтов
, эффект которого будет состоять в том, чтобы сделать тип данных той же шириной на обоих языках; преобразование в собственный тип данных должно будет быть выполнено в обоих концах. Подкачайте использование bool для булевской переменной в определении библиотечной функции, кода скрипки в библиотеке для преобразования, и Вы сделаны.
Так, то, что Вы оказываетесь перед необходимостью делать вместо этого, создают контейнер между программой C++ и библиотекой C.
Вы имеете:
extern "C" bool library_func_1(int i, char c, bool b);
И необходимо создать:
bool library_func_1_cpp(int i, char c, bool b)
{
int result = library_func_1(i, c, static_cast<int>(b));
return (result==true);
}
И теперь называют library_func_1_cpp вместо этого.