2015-05-06 2 views
-3
abort action      islemi durdur(MS) 
abort sequence      durdurma dizisi(IBM) 

У меня есть file.txt, как выше. Я хочу прочитать это из файла file.txt отдельно. Кроме file.txt я получил еще 2 turkce.txt и ingilizce.txtОбработка файлов в C чтение нескольких символов

Вот то, что я хочу сделать:

Я хочу прочитать из file.txt и разделение слов английского и турецкие. После этого ingilizce.txt стать как этот

преждевременное прекращение действия
последовательности прерывани

и turkce.txt как этот

islemi durdur (MS)
durdurma dizisi (IBM)

Кроме того, у меня есть несколько столбцов и d 5127 строк. Номера столбцов могут изменять каждую строку.

Вот рис какой-то части моего file.txt http://i59.tinypic.com/33m0iu8.png

Спасибо за ваши ответы.

Обновление: Я решил проблему. Разница между начальной левой колонной первой буквы и, начиная прямо колонен елей букв одинакова и равна 37.

Поэтому я использую

FILE* fp = fopen("file.txt","r"); 
char s[256]; 
fgets(s, 37 , "fp); 
+5

C! = C++, и вы что-то пробовали (мы не собираемся просто писать код для вас)? – crashmstr

+0

Входит ли турецкая часть в ту же колонку, например. столбец 36, в каждой строке? Существуют ли только промежутки между английской и турецкой частями? Или могут быть вкладки? Или эти две части даже разделены вкладками? Вы должны быть более конкретными. –

+0

Он меняет каждую строку. У меня 5127 разных строк. @crashmstr Я не жду, чтобы вы написали мне код. Мне просто нужно знать, как это сделать. –

ответ

0

Вы не говорите это явно, но ваш файл имеет два столбца фиксированной ширины, которые вы хотите разделить.

подстроку строки 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, если у вас нет фантастического форматирования с типографскими кавычками или некоторыми такими.

0

Там может быть лучшими решениями, но здесь просто один.

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::ifstream inFile("file.txt"); 
    std::ofstream outFileT("turkce.txt", std::ios::app); 
    std::ofstream outFileE("ingilizce.txt", std::ios::app); 
    std::string a; 
    std::string b; 

    for (int i = 0; i < 2; i++) { 
    inFile >> a >> b; 
    outFileE << a + " " + b + "\n"; 

    inFile >> a >> b; 
    outFileT << a + " " + b + "\n"; 
} 
} 

Я предположил, что у вас есть две линии, но вы можете сначала определить количество строк в файле.

+0

Этот код будет работать для показанного отрывка входного файла, где и английская, и турецкая части имеют по два слова, но не больше. Как насчет определения конца ввода по условию конца файла? –

+0

Я выполняю этот код, но он не работает. –

+0

@MustafaAlp Вам необходимо иметь файл file.txt в каталоге, где выполняется исполняемый файл. В том же каталоге будет создано два файла turkce.txt ingilizce.txt. Вы получили ошибку? –

Смежные вопросы