Вы не говорите это явно, но ваш файл имеет два столбца фиксированной ширины, которые вы хотите разделить.
подстроку строки str
из фиксированного индекса i
до конца может быть выражена с указателем арифметика: str + i
или &str[i]
. Строки, которые не имеют нулевого конца (например, ваш первый столбец), могут быть напечатаны путем указания длины с полем точности printf
s, например. printf("%.*s", len, str)
.
быстрый и грязный способ напечатать два столбца:
char line[80];
int col = 36;
while (fgets(line, sizeof(line), in)) {
fprintf(en, "%.*s\n", col, line);
fprintf(tr, "%s", line + col);
printf("\n");
}
Этот метод имеет ряд недостатков: он будет печатать мусор, если строка короче, чем ширина разделения, то есть, если правый столбец пуст , Он также печатает пробелы в столбцах для левого столбца, который выглядит неопрятно.Итак, давайте напишем функцию, которая расщепляет струны хорошо, что мы можем назвать так:
while (fgets(line, sizeof(line), in)) {
char *stren, *strtr;
split_at(line, &stren, &strtr, 36);
fprintf(en, "%s\n", stren);
fprintf(tr, "%s\n", strtr);
}
Функция выглядит следующим образом:
void split_at(char *line, char **left, char **right, int col)
{
char *trim = line;
char *p = line;
*left = line;
*right = line + col;
while (p < *right) {
if (*p == '\0') {
*right = p;
break;
}
if (!isspace(*p)) trim = p + 1;
p++;
}
*trim = '\0';
trim = p;
while (*p) {
if (!isspace(*p)) trim = p + 1;
p++;
}
if (trim) *trim = '\0';
}
Это должно работать для примера данных. Он также будет работать для пустых левых или правых столбцов. Он не будет работать, если между левым и правым столбцами нет места, т. Е. Когда левое и правое искусство вставлены вместе.
Этот метод также будет работать, только если кодовые точки строк имеют одинаковую длину. Вы не указали, какую кодировку вы используете для своих данных. Если вы используете ISO-8859-9, вы будете в порядке. Если вы используете UTF-8, все не-ASCII-кодовые точки, т. Е. Турецкие специальные символы, будут представлены более чем одним байтом. То, что выглядит как столбец фиксированной ширины, не имеет фиксированной ширины в представлении памяти.
При этом вы должны быть в безопасности, если ваш текст на английском находится в левой колонке. Текст на английском языке состоит только из символов ASCII, если у вас нет фантастического форматирования с типографскими кавычками или некоторыми такими.
C! = C++, и вы что-то пробовали (мы не собираемся просто писать код для вас)? – crashmstr
Входит ли турецкая часть в ту же колонку, например. столбец 36, в каждой строке? Существуют ли только промежутки между английской и турецкой частями? Или могут быть вкладки? Или эти две части даже разделены вкладками? Вы должны быть более конкретными. –
Он меняет каждую строку. У меня 5127 разных строк. @crashmstr Я не жду, чтобы вы написали мне код. Мне просто нужно знать, как это сделать. –