gpt4 book ai didi

c - 使用 fread() 通过文件和标准输入解析数据

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

我正在尝试编写一种算法,该算法从文件中获取输入并构建所谓的“s1 记录”。 (此函数的功能并不重要)根据命令行参数,程序会将 inputFile 设置为指定文件,如果未提供文件,则设置为 stdin。

算法的结构需要能够处理两种文件模式。

其想法是获取 FILE* 数据并将其读入大小为 16 字节的缓冲区中。每16字节数据,就会建立一条s1记录。只要有 16 个字节可供读取,它就可以正常工作。一旦有一行少于 16 字节,就不会创建 s1 记录。

我测试了输出,这些是我注意到的一些事情:

当我使用“stdin”运行程序时,系统会提示我输入用户输入。我输入 20 个字符(应在 1 个记录中打印 16 个字符,在另一个记录中打印 4 个字符),我的输出如下:

12345678901234567890
Buffer: 1234567890123456
S113000031323334353637383930313233343536AA

当我使用包含一行字母的文件(record.dat)运行程序时,我得到以下结果:

Buffer: ABCDEFGHIJKLMNOP
Buffer: QRSTUVWXYZKLMNOP

这也是无效的,因为它也会在行末尾打印“KLMNOP”。

我的问题是:我如何构造它以使用相同的算法接受来自文件或标准输入的输入,以及我在算法中到底做错了什么?我已尽力提供所有有用的信息,并且可以根据要求指定更多详细信息。下面是我正在尝试编写的算法的代码。

如果未指定文件,则 inputFile 设置为 stdin

    char buffer[kMaxLineSize + 1] = { '\0' };
char byte = 0;

int count = 1;

while((fread(buffer, 1, kMaxLineSize, inputFile)))
{
printf("%c", byte);

clearCRLF(buffer);
printf("Buffer: %s\n", buffer);

if(outputFormat == 1)
{
char s1Record[kMaxSRecordSize] = { 0 };
buildS1Record(addressField, s1Record, buffer);

fprintf(outputFile, "%s\n", s1Record);

addressField += strlen(buffer);
s1Count++;
}
else
{
char asmRecord[kMaxASMRecordSize] = { 0 };
buildAssemblyRecord(asmRecord, buffer);

fprintf(outputFile, "%s\n", asmRecord);
}
}

最佳答案

我会尝试合并此答案中的评论。

但首先,您所说的 s1“记录”并不是记录。它是一个最多包含 16 个字符和一个终止空字符的字符串。根据我的理解,记录是一个具有可能不同类型字段的结构,其中一个可能是字符串。

代码修复如下:

char buffer[kMaxLineSize + 1] = { '\0' };
int len;
while (len=fread(buffer, 1, kMaxLineSize, inputFile))
{
...
char s1Record[kMaxSRecordSize] = { 0 };
buildS1Record(addressField, s1Record, buffer, len);

因此您将读取的长度传递给函数。现在它可以复制读取的字符并以 '\0' 字符终止。另请注意,kMaxLineSizekMaxSRecordSize 之间可能存在差异:它们必须具有相同的大小(对于 \0 加 1),因此更好使用单个变量。

我希望这个迟来的答案对您仍然有用。

关于c - 使用 fread() 通过文件和标准输入解析数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35739139/

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