$ ./bin/fgets_name_number dat/name_number.txt
Name Surname1, 789456133
Name Surname2, 135486661
Name Surname3, 984651333
我是编程的初学者,我不知道如何在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的数字线的长度
有人请帮助。谢谢。
您可以使用strlen
检查字符串的长度(例如:strlen(str)
)
通过执行str[ strlen(str) - 1] = '\0';
,您可以完全摆脱换行符(假设字符串以'\n'
结尾,请检查!)
虽然您可以在此处使用fscanf
在单个调用中同时读取name
和number
,然后处理未读的输入缓冲区中剩余的'\n'
,但是,这是一种极其脆弱的方法接近连续行的读取,对于新的C程序员,scanf
和fscanf
充满了很多陷阱。最好使用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' */ ...
现在,如果在循环中达到这一点,您已经用相关的字符串填充了
name
和number
,因此只需输出用逗号分隔的值即可,例如
... 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
$ ./bin/fgets_name_number dat/name_number.txt
Name Surname1, 789456133
Name Surname2, 135486661
Name Surname3, 984651333