C++ C中读取多个字符的文件处理
我有一个类似上面的file.txt文件。我想分别从file.txt文件中读取此内容。除了file.txt之外,我还有2个turkce.txt和ingilizce.txt 以下是我想做的: 我想从file.txt中读取,并将英语和土耳其语分开。然后ingilizce.txt变成这样 中止行动 中止序列 还有像这样的turkce.txt 杜姆斯岛 杜尔玛迪齐西酒店 此外,我有多个列和5127行。列编号可以更改每一行 这是我的file.txt文件的一部分图片 谢谢你的回答 更新:我解决了这个问题。左栏第一个字母的开头和右栏第一个字母的开头之间的差值相同,等于37 所以我用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文件的一部分图片 谢谢你的回答 更新:我解决了这个问题。左
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';
}