gpt4 book ai didi

C fgets() 如何判断行是否大于指定大小

转载 作者:太空狗 更新时间:2023-10-29 15:28:10 24 4
gpt4 key购买 nike

我正在使用 fgets()popen("ps -ev", "r") 中读取行,但我不知道如何知道 fgets() 部分或全部读取一行,如果部分读取/丢弃多余部分。

当从 popen() 读取每一行时,我正在读取前 1024 个字符并从中获取我需要的信息,这非常有效。当行大于 1024 个字符时,问题就出现了,然后我读取的下一行是上一行的延续,这不是我需要的格式(即每行开头每列的值)。如果我知道我是否只部分读取了一行(即该行有 1024 个或更多字符,我想读取并丢弃每 1024 个字符直到它到达末尾。一旦到达末尾,我可以调用 fgets () 一次,这次它将从下一行的开头读取,而不是上一行的继续。

我知道 fgets() 一直往上读,直到它找到一个换行符或直到它达到提供的限制,然后继续读取该行的剩余部分。我试过检查最后一个字符是“\0”,行中倒数第二个字符是“\n”,但这不起作用。如果有帮助,我会在下面发布该代码。

如果您运行代码,您将看到 LINE: num S num:num.num ...(其中 num 是一个数字)这是每一行的内容应该开始于。有些行看起来像 LINE: AAAAAAQAAABMAAAAQAAAAAAAAAAMAAAAFAAAAEAAAAAAAAADAAAACwAAABA...。这些是上一行多余的行,这些是导致问题的原因,因为它们的格式不正确。

非常感谢任何帮助。

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

#define NEWLINE() printf("\n");
#define DIVIDER() printf("============================================================================\n");
#define PL(l) printf("LINE: %s\n", l);

int const MAX_PROCESSES = 20;
int const BUFFER_SIZE = 1024;

int exhaustedLine(char* line) {
if (line[sizeof line - 1] == '\0' && line[sizeof line - 2] != '\n') {
printf("n:%c 0:%c\n", line[sizeof line - 2], line[sizeof line - 1]);
NEWLINE();
return -1;
}
return 0;
}

int main(int argc, char const *argv[]) {
FILE* fp = popen("ps -ev", "r");
char buf[BUFFER_SIZE];
char* line = (char*)1;

while (line) {
DIVIDER();
line = fgets(buf, BUFFER_SIZE, fp);
PL(line);
if (exhaustedLine(line) != 0) {
printf("END OF LINE\n");
}
}

return 0;
}

最佳答案

您的想法是正确的:如果读取了整行,则缓冲区包含一个换行符。否则该行要么比缓冲区大小长,要么我们在文件的末尾并且最后一行未终止。

您的实现的主要问题是 char* line ... sizeof linesizeof产生其操作数表达式类型的大小,所以sizeof line的意思是sizeof(char *),也就是一个指针的大小,而不是 line 指向的数组的大小。

此外,如果读取的行较短,则 line[SIZE - 1] 将访问未初始化的内存。

最简单的解决方案:

int is_full_line(const char *line) {
return strchr(line, '\n') != NULL;
}

只需使用strchr 来搜索'\n' 的字符串。

要丢弃超长行的其余部分,您有多种选择:

  • 您可以在循环中再次调用 fgets
  • 你可以在循环中调用fgetc:int c; while ((c = fgetc(fp)) != EOF && c != '\n') {}
  • 您可以使用 fscanf:fscanf(fp, "%*[^\n]"); fscanf(fp, "%*1[\n]");

关于

int const BUFFER_SIZE = 1024;

注意 const 在 C 中不声明常量;它声明只读变量。 char buf[BUFFER_SIZE] 被认为是可变长度数组,因为大小不是常量。

要在 C 中获得一个真正的整数常量,您需要使用 enum 代替:

enum { BUFFER_SIZE = 1024 };

关于C fgets() 如何判断行是否大于指定大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55823341/

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