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

C++ C中读取多个字符的文件处理,c++,c,C++,C,我有一个类似上面的file.txt文件。我想分别从file.txt文件中读取此内容。除了file.txt之外,我还有2个turkce.txt和ingilizce.txt 以下是我想做的: 我想从file.txt中读取,并将英语和土耳其语分开。然后ingilizce.txt变成这样 中止行动 中止序列 还有像这样的turkce.txt 杜姆斯岛 杜尔玛迪齐西酒店 此外,我有多个列和5127行。列编号可以更改每一行 这是我的file.txt文件的一部分图片 谢谢你的回答 更新:我解决了这个问题。左

我有一个类似上面的file.txt文件。我想分别从file.txt文件中读取此内容。除了file.txt之外,我还有2个turkce.txt和ingilizce.txt

以下是我想做的:

我想从file.txt中读取,并将英语和土耳其语分开。然后ingilizce.txt变成这样

中止行动 中止序列

还有像这样的turkce.txt

杜姆斯岛 杜尔玛迪齐西酒店

此外,我有多个列和5127行。列编号可以更改每一行

这是我的file.txt文件的一部分图片

谢谢你的回答

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

所以我用

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

可能有更好的解决方案,但这里有一个简单的解决方案

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

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

您没有明确地说出来,但是您的文件有两个固定宽度的列,您希望将它们分开

从固定索引i到结尾的字符串str的子字符串可以用指针算法表示:str+i或&str[i]。可以通过使用printfs precision字段指定长度(例如printf%.*s、len、str)来打印与第一列不同的以零结尾的字符串

打印两列的快捷方法是:

#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";
 }
}
此方法有一些缺点:如果字符串小于分隔宽度,即如果右列为空,则会打印垃圾。它还为左列打印列填充空格,这看起来不整洁。让我们编写一个函数,将字符串很好地拆分,我们可以这样调用它:

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);
}
这应该适用于您的示例数据。它也适用于空的左列或右列。如果左栏和右栏之间没有空格,即将左栏和右栏粘贴在一起时,该功能将不起作用

仅当字符串的代码点具有相同的长度时,此方法才有效。您还没有说明数据使用哪种编码。如果你使用ISO-8859-9,你会没事的。如果使用UTF-8,则所有非ASCII码点(即土耳其特殊字符)将由多个字节表示。看起来像固定宽度的列在其内存表示中没有固定宽度


也就是说,只要你的英文文本在左列,你就应该是安全的。英文文本仅由ASCII字符组成,除非您使用排版引号或类似的格式。

C!=C++,你有没有尝试过,但是我们不准备为你编写代码?土耳其语部分是在同一列中开始的,例如每行中的第36列?英语和土耳其语部分之间只有空格吗?或者可能有标签?或者这两个部分甚至是用标签分开的?你应该更具体一点,它会改变每一行。我有5127个不同的排@crashmstr我不是在等你为我写代码。我只需要知道如何做到这一点。在这种情况下,我会逐行读取文件,查找两个或更多空格字符的长度,并将它们解释为分隔符。如果你的词汇表条目之间的空格不超过一个,那么这应该是可行的。好吧,从图片上看,土耳其语部分总是在每一行的同一列中开始。对于科塞人来说,线路本身是不同的。除了不显示任何代码外,您至少应该努力准确地描述您的问题。此代码适用于显示的输入文件摘录,其中英语和土耳其语部分各有两个单词,但其他内容不多。如何通过文件结束条件确定输入结束?@mustafalp您需要在可执行文件运行的目录中有file.txt文件。在同一目录下将创建两个文件turkce.txt ingilizce.txt。你收到错误了吗?没有,我没有收到上面代码中的任何错误。但我有多个Coulumn,而不仅仅是2个。
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';
}