gpt4 book ai didi

c - 逐行读取C

转载 作者:行者123 更新时间:2023-11-30 15:13:28 42 4
gpt4 key购买 nike

我有一个 txt 文件,其中包含一些文件名及其大小。这就是我编写txt文件的方式:

banana //file name
3 //the size of file banana
programs
12
music
524

我必须找到键盘输入的文件名并显示它的大小。

这是我的代码:

 FILE *text;
text=fopen("text.txt","r");
printf("Scan the number of letters of your file name");
int n;
scanf("%d",&n);
char s[++n];
printf("Scan the file name you are looking for: ");
int i;
for(i=0;i<=n;i++)
{
scanf("%c",&s[i]);
}
int l=0;
char c[n];
char g;
while(!feof(text))
{
if(l%2==1) {fgetc(text); fgetc(text); l++;}
if(l%2==0)
{
fgets(c,n,text);
fgetc(text);
for(i=0;i<n;i++)
{
printf("%c",c[i]);
}
l++;
}
}

显然,这是不正确的。你能帮助我吗?我有点困惑。

最佳答案

呃!请详细了解基本输入。您的程序有各种缺陷:

  • fgetc 读取单个字符。这有时很有用,但显然你想阅读整行。 fgets 就是这样做的。您可以使用一次,但不建议混合使用。预先决定要使用哪种输入范例:按字符 (fgetc)、按行 (fgets) 或按标记 (fscanf) >).
  • 请不要让用户输入文件名中的字符数。快问一下,MySpiffyDocument.txt 有多少个字符?这是计算机应该做的工作。
  • 不要使用feof来控制yopur输入。所有输入函数都有特殊的返回值,指示已读取文件末尾或发生错误。对于fgets,该返回值为NULL,对于fgetc,该返回值为特殊常量EOF。当您遇到用于对两个结束条件进行事后分析的特殊返回值时,函数 feofferror 非常有用。
  • 负责核心程序逻辑的内部循环根本没有意义。例如,对于奇数 l,递增 l,然后测试偶数 l – 这将是正确的,因为您刚刚递增了奇数l。在这种情况下请使用else。并且不要将无论如何发生的事情放在条件 block 中:在 if/else block 之后递增 l 一次。

这是一个示例实现:

#include <stdlib.h>
#include <stdio.h>

int process(const char *filename)
{
char line[80];
char name[80];
int size;
int count = 0;

FILE *f = fopen(filename, "r");

if (f == NULL) return -1;

while (fgets(line, sizeof(line), f)) {
if (count % 2 == 0) {
if (sscanf(line, "%s", name) < 1) continue;
} else {
if (sscanf(line, "%d", &size) < 1) continue;
printf("%12d %s\n", size, name);
}

count++;
}
fclose(f);

return 0;
}

int main()
{
char line[80];
char name[80];

puts("Please enter filename:");

while (fgets(line, sizeof(line), stdin)) {
if (sscanf(line, "%s", name) == 1) {
process(name);
break;
}
}

return 0;
}

注意事项:

  • 该程序最多使用 80 个字符。缓冲区大小;这意味着您的行最多可以有 78 个字符长 – 行内容加上换行符 '\n' 加上空终止符 '\0'。对于很多情况来说这应该没问题,但最终该行可能会溢出。 (所以你的文件名字母计数有一些优点,但真正的解决方案是动态分配内存。我现在不会打开那 jar 蠕虫。)
  • 代码使用双重策略:首先读取行,然后使用 sscanf 扫描这些行,以便只读取每行的第一个单词。
  • 跳过空行。即使不包含有效数字的行也会被跳过。这是草率的错误处理,可能会导致奇数/偶数计数出错。
  • 在 C 语言中,通过键盘交互读取内容并不容易。main 中笨拙的 fgets/sscanf 结构试图处理当用户输入空行或通过 Ctrl-D/Z 唤起文件结束信号时的情况。更好、更简单的方法是通过 argc 和 argv 向命令行提供参数。
  • 我已将文件读取移至单独的函数中。

关于c - 逐行读取C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34569711/

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