gpt4 book ai didi

处理文件时的困惑

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:28 25 4
gpt4 key购买 nike

我正在编写一个程序,它从一个文件中获取一个字符串,从另一个文件中获取一个字符串,然后将它们写入单独列中的第三个文件。我真的有两个问题,如果我使用 fgets 从文件中获取字符串并且它在行尾停止。它会自动知道从下一行开始下一个字符串吗?另外,如何格式化输入以形成两列。一个例子是...

第一个字符串是第一个文件中的“John”。第二个字符串是第二个文件中的“Appleseed”。

第三个文件将包含“John______________________Appleseed”第三个文件的第二行应该是“Benny__________________________Backburner”

只是为了格式化列。

最佳答案

你想要下划线,还是空格就足够了?空格要简单得多。您可以阅读 printf() 的规范查看格式字符串作用的详细信息。

while (fgets(buffer1, sizeof(buffer1), fp1) != 0 &&
fgets(buffer2, sizeof(buffer2), fp2) != 0)
{
buffer1[strcspn(buffer1, "\n")] = '\0';
buffer2[strcspn(buffer2, "\n")] = '\0';
fprintf(fp3, "%-25s %s\n", buffer1, buffer2);
}

这从前两个文件中各读取一行,从缓冲区中删除换行符,然后将它们格式化为第一列左对齐,宽度为 25,第二列在 3 个空格后打印。

如果你必须使用下划线而不是空格,那么你需要这样的东西:

char uscore[256];
memset(uscore, '_', sizeof(uscore)-1);
uscore[sizeof(uscore)-1] = '\0';

while (fgets(buffer1, sizeof(buffer1), fp1) != 0 &&
fgets(buffer2, sizeof(buffer2), fp2) != 0)
{
buffer1[strcspn(buffer1, "\n")] = '\0';
buffer2[strcspn(buffer2, "\n")] = '\0';
int len1 = max(0, 25 - strlen(buffer1));
fprintf(fp3, "%s%*.*s%s\n", buffer1, len1, len1, uscore, buffer2);
}

将其放在一起,同时说明这两种技术:

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
if (argc != 4)
{
fprintf(stderr, "Usage: %s infile-1 infile-2 outfile\n", argv[0]);
return 1;
}
FILE *fp1 = fopen(argv[1], "r");
FILE *fp2 = fopen(argv[2], "r");
FILE *fp3 = fopen(argv[3], "w");
if (fp1 == 0 || fp2 == 0 || fp3 == 0)
{
fprintf(stderr, "%s: failed to open one of the files %s, %s or %s\n",
argv[0], argv[1], argv[2], argv[3]);
return 1;
}

char uscore[256];
memset(uscore, '_', sizeof(uscore)-1);
uscore[sizeof(uscore)-1] = '\0';
char buffer1[1024];
char buffer2[1024];

while (fgets(buffer1, sizeof(buffer1), fp1) != 0 &&
fgets(buffer2, sizeof(buffer2), fp2) != 0)
{
buffer1[strcspn(buffer1, "\n")] = '\0';
buffer2[strcspn(buffer2, "\n")] = '\0';
fprintf(fp3, "%-25s %s\n", buffer1, buffer2);

int len1 = strlen(buffer1);
if (len1 < 28)
len1 = 28 - len1;
else
len1 = 0;
fprintf(fp3, "%s%*.*s%s\n", buffer1, len1, len1, uscore, buffer2);
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}

示例输入文件 data.1:

California
Esoteric
Mismatch
Unexpected
Non-sequitur
Extra-long word list from file 1

示例输入文件 data.2:

Drought
Persecution
Preliminary
Adequate
Pusillanimous
Rather long word from file.2 too

示例输出:

California                  Drought
California__________________Drought
Esoteric Persecution
Esoteric____________________Persecution
Mismatch Preliminary
Mismatch____________________Preliminary
Unexpected Adequate
Unexpected__________________Adequate
Non-sequitur Pusillanimous
Non-sequitur________________Pusillanimous
Extra-long word list from file 1 Rather long word from file.2 too
Extra-long word list from file 1Rather long word from file.2 too

根据对所需格式的更精确定义,您可以进行无数次调整。除其他外,您可以确保“必须有下划线”示例中的第一个和第二个单词之间至少有 3 个下划线。您可以限制打印的字符串的长度。

代码应该检查它是否在前 1023 个字节内得到一个换行符;它没有。

关于处理文件时的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45292696/

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