C中的文件处理读取多个字符

时间:2015-05-06 18:13:29

标签: c++ c

abort action                        islemi durdur(MS)
abort sequence                      durdurma dizisi(IBM)

我有一个像上面这样的file.txt。我想分别从file.txt中读取这个。除了file.txt,我还有2个turkce.txt和ingilizce.txt

这是我想要做的:

我想从file.txt中读取并分隔英语和土耳其语。在那之后ingilizce.txt变得像这样

  

中止行动
  中止序列

和像这样的turkce.txt

  

islemi durdur(MS)
  durdurma dizisi(IBM)

另外,我有多列和5127行。列号可以改变每一行。

这是我的file.txt的某些部分的图片 http://i59.tinypic.com/33m0iu8.png

感谢您的回答。

更新:我解决了这个问题。左栏第一个字母的开头和右栏第一个字母的开头之间的差异是相同的,它等于37。

所以我用

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

2 个答案:

答案 0 :(得分: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";
 }
}

我假设您有两行,但您可以先确定文件中的行数。

答案 1 :(得分: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字符组成,除非您使用印刷引号或其他类似格式进行格式化。