处理文件时的困惑

标签 c string file format

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

相关文章:

c - 使用与函数本身使用的命名参数不同的命名参数来声明函数的目的是什么?

C - 链表无法将节点**转换为节点*

c++ - 使用匿名 Stringstream 构造字符串

mysql - 如何从 MySQL 中的字符串中删除所有非字母数字字符?

c - 我不断收到一个未知错误,说预期的表达式 :

c++ - GCC - 在特定偏移量中定义成员的结构

C - 主要参数的输出反转

python - 将 Geodataframe 写入 geopandas 文件时出现“不支持的驱动程序”错误

c - 从 PGM 文件 C 读取矩阵时出现问题

c++ - 在 C++ 中将二进制数据写入 fstream