我正在编写一个程序,它从一个文件中获取一个字符串,从另一个文件中获取一个字符串,然后将它们写入单独列中的第三个文件。我真的有两个问题,如果我使用 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/