can';在c语言中不能从文件中读取字符串
我试图逐行读取文本文件并打印前17个字符can';在c语言中不能从文件中读取字符串,c,fopen,scanf,C,Fopen,Scanf,我试图逐行读取文本文件并打印前17个字符 FILE *devices; devices = NULL; devices = fopen("devices.txt", "r"); char deviceaddr[17]; char addr[17]; char line[1024]; while (fgets(line,1024,devices) != NULL) { fscanf(devices,"%s", deviceaddr); printf("%s\n", devi
FILE *devices;
devices = NULL;
devices = fopen("devices.txt", "r");
char deviceaddr[17];
char addr[17];
char line[1024];
while (fgets(line,1024,devices) != NULL)
{
fscanf(devices,"%s", deviceaddr);
printf("%s\n", deviceaddr);
}
fclose(devices);
对于第一行,输出应该是
00:07:80:4C:0E:EE
,但是当循环读取一行文本时,fscanf
将读取下一组文本(可能会意外溢出该缓冲区)。似乎您应该在循环中从缓冲区行打印所需的数据
例如,假设有三行文本
00:07:80:4C:0E:EE --> ends up line buffer line
second --> ends up in deviceaddr
third line --> ends up in line (unless the fscanf did not consume newline)
循环读取一行文本时,fscanf
将读取下一组文本(可能会意外溢出该缓冲区)。似乎您应该在循环中从缓冲区行打印所需的数据
例如,假设有三行文本
00:07:80:4C:0E:EE --> ends up line buffer line
second --> ends up in deviceaddr
third line --> ends up in line (unless the fscanf did not consume newline)
输出不可能是“00:07:80:4c:0E:EE”
,因为
由于缓冲区的原因,这将导致未定义的行为
溢出字符串需要18个字节,但您只提供
17在fscanf
中,如果没有
指定长度
阅读完后,您在设备上调用fscanf
一行;如果你在逐行阅读,你想使用
sscanf
在您阅读的行上 输出不可能是“00:07:80:4c:0E:EE”
,因为
由于缓冲区的原因,这将导致未定义的行为
溢出字符串需要18个字节,但您只提供
17在fscanf
中,如果没有
指定长度
阅读完后,您在设备上调用fscanf
一行;如果你在逐行阅读,你想使用
sscanf
在您阅读的行上你确定你是指C++吗?这是纯C,这比C++多很多。C++将使用<代码> STD::IFSturis/Cube,使用“代码>(STD::GETLIN)< /CUT>,并使用前17个字符,使用<代码>子())/>代码。当使用固定大小的数组时,不要忘记尾随“0”。您是指打印每行的前17个字符吗?@ HMJD。我只得到符号和东西。您确定您是指C++吗?这是纯C,这比C++多很多。C++将使用<代码> STD::IFSturis/Cube,使用“<代码>(STD::GETLIN)< /CUT>,并使用前17个字符,使用代码< >子())/>代码。当使用固定大小的数组时,不要忘记尾随“0”。您是指打印每行的前17个字符吗?@ HMJD.我只得到符号和东西。我正在逐行阅读。此代码用于从文件而不是字符串中读取int。如果它使用相同的逻辑(fgets后跟fscanf),则肯定会跳过第一行文本。如果fscanf不使用换行符,那么FGET将在每次fscanf调用后有效地读取换行符。因此,除了“丢弃”第一行之外,它还可以“根据需要”工作。我正在尝试逐行阅读。此代码用于从文件而不是字符串中读取int。如果它使用相同的逻辑(fgets后跟fscanf),则肯定会跳过第一行文本。如果fscanf不使用换行符,那么FGET将在每次fscanf调用后有效地读取换行符。因此,除了“丢弃”第一行之外,它还可以“根据需要”工作。