如何在文本文件中查找行的长度?

问题描述 投票:-1回答:3

我是编程的初学者,我不知道如何在C语言的文本文件中找到行长。我有一个文本文件,其中有名字和数字,每个名字和数字都在不同的行上,当我需要在输出中打印它时,我需要在同一行上有名字和数字。但是在文本文件中,它必须位于不同的位置。请问我该如何完成?

文本文件示例:

Name Surname1
789456133
Name Surname2
135486661
Name Surname3
984651333

现在我的输出看起来像这样:

Name Surname1
, 789456133
Name Surname2
, 135486661
Name Surname3
, 984651333

使用printf("%s, %s", name, number);

而且我需要这样:姓氏1,789456133姓氏2,135486661名字Surname3,984651333

我知道,我需要以某种方式计算名称线的长度+不带/ n的数字线的长度

有人请帮助。谢谢。

c stdio
3个回答
0
投票

您可以使用strlen检查字符串的长度(例如:strlen(str)

通过执行str[ strlen(str) - 1] = '\0';,您可以完全摆脱换行符(假设字符串以'\n'结尾,请检查!)


0
投票

虽然您可以在此处使用fscanf在单个调用中同时读取namenumber,然后处理未读的输入缓冲区中剩余的'\n',但是,这是一种极其脆弱的方法接近连续行的读取,对于新的C程序员,scanffscanf充满了很多陷阱。最好使用line-directional输入功能(例如fgets()或POSIX getline())来一次读取一行。

要使用面向行的输入,请始终声明一个足够大的缓冲区以处理您预期的最大数据行(然后将缓冲区的大小增加一倍或四倍),例如,在您的情况下,最大预期行为14 -个字符,缓冲区大小为64个字符即可(不要跳过缓冲区大小)。例如:

#define MAXC 64
...
int main (int argc, char **argv) {

    char name[MAXC], number[MAXC];  /* buffers to hold name name number */
    ..                              /* open/validate file is open here */

对于您的读取循环,您可以简单地连续循环并将一行读入name,并将一行读入number以验证每一个都成功,例如

    while (1) {         /* loop continually reading each line until EOF */
        if (!fgets (name, MAXC, fp))        /* read/validate name into name */
            break;
        name[strcspn (name, "\n")] = 0;     /* trim trailing '\n' */
        if (!fgets (number, MAXC, fp))      /* read/validate number */
            break;
        number[strcspn (number, "\n")] = 0; /* trim trailing '\n' */
        ...

现在,如果在循环中达到这一点,您已经用相关的字符串填充了namenumber,因此只需输出用逗号分隔的值即可,例如

        ...
        printf ("%s, %s\n", name, number);  /* output result */
    }

关闭您的文件,您已完成。注意使用strcspn()修剪尾随的strcspn()。通过简单地用'\n'覆盖[相当于'\n'),这是处理删除'\0'的非常快速,可靠的方法。

如果结合了上述逻辑,您的输出将是所需的:

示例使用/输出

将您输入的文件名0作为第一个参数传递给程序,您将得到:

dat/name_number.txt

通过逻辑工作,结合您已有的代码,如果您还有其他问题或陷入困境,请告诉我。如果遇到困难,请将完整的代码作为编辑内容发布,并在问题中添加addition

。不要删除已经发布的内容。 (将您的代码缩进4个空格,以便在您编辑的问题中正确格式化)
$ ./bin/fgets_name_number dat/name_number.txt
Name Surname1, 789456133
Name Surname2, 135486661
Name Surname3, 984651333

}

输出:输入行:hii hello

行长为9


-1
投票
$ ./bin/fgets_name_number dat/name_number.txt
Name Surname1, 789456133
Name Surname2, 135486661
Name Surname3, 984651333
© www.soinside.com 2019 - 2024. All rights reserved.