gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:10:19 24 4
gpt4 key购买 nike

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就变成这样了

abort action
abort sequence

和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);

最佳答案

您没有明确说明,但您的文件有两个固定宽度的列,您希望将其分开。

字符串str中从固定索引i到末尾的子串可以用指针运算来表示:str + i&str[i]。可以通过使用 printf 的精度字段指定长度来打印不以零结尾的字符串(例如第一列),例如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 中的文件处理读取多个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30084521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com