我很难将这样的东西解析成数组。
所以我的文本文件test.txt有这样一行:(1231212A,1231212B)(1231212C,321128D)
我试图把它扫描成一个数组,但它需要分成几个部分
int类型的part1应为:123
第二部分:12
第3部分:12
第四部分(字符):A
我需要在这条线上做4次
这是我的代码,但它不能正常工作
{
int nums[1][12];
char chars[1][4];
FILE *file;
file = fopen("test.txt", "r");
if (file != NULL){
fscanf(file , "%*s%3d %2d %2d %s %*s %2d %2d %2d %s%*s %*s%3d %2d %2d %s%*s %2d %2d %2d %s%*s"
, &nums[0][0],&nums[0][1],&nums[0][2],&chars[0][0],&nums[0][3],&nums[0][4],&nums[0][5],&chars[0]
[1],&nums[0][6],&nums[0][7],&nums[0][8],&chars[0][2],&nums[0][9],&chars[0][10],&nums[0][11],&chars[0]
[3]);
}
当我打印这些数组时,它们不会打印正确的数字和字符。我需要你帮我做fscanf的部分谢谢
正如@chux在他的回答中提供的,关键是将格式字符串与要解析的数据正确匹配,然后根据预期的转换次数严格验证返回。您的格式字符串中的主要错误是您不必要地包含了%*s
(尝试并跳过"(
)和%s%*s
(尝试并跳过逗号)和%s%*s%*s
(尝试并跳过几个位置的") "
,其效果是读取并丢弃整个第一个数字,例如(1231212A,
作为字符串,开始读取第二个值一组数字等等。
更接近的匹配如@chux的答案所示,或者简单地说:
"(%3d%2d%2d%c, %3d%2d%2d%c) (%3d%2d%2d%c, %3d%2d%2d%c"
(其区别仅在于不提供额外的空白,也不读取所使用的字符数——还要注意,在读取最后一个字符时,格式字符串中不需要结尾的“”,例如,'D'
结束转换)
当您使用1行的2D数组时,下面的简化示例将1D数组用于chars
和Nums
,并且可以编写如下以读取fget()
将缓冲区传递到sscanf()
验证返回并输出收集的值或显示错误,如果解析失败:
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
int main (int argc, char **argv) {
char buf[MAXC], chars[4];
int nums[12];
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read line into buf with fgets() */
/* parse with sscanf -- validate 16 conversions take place */
if (sscanf (buf, "(%3d%2d%2d%c, %3d%2d%2d%c) (%3d%2d%2d%c, %3d%2d%2d%c",
&nums[0], &nums[1], &nums[2], &chars[0],
&nums[3], &nums[4], &nums[5], &chars[1],
&nums[6], &nums[7], &nums[8], &chars[2],
&nums[9], &nums[10], &nums[11], &chars[3]) == 16) {
/* output result */
printf ("%d %d %2d %c\n%d %d %2d %c\n%d %d %2d %c\n%d %d %2d %c\n",
nums[0], nums[1], nums[2], chars[0],
nums[3], nums[4], nums[5], chars[1],
nums[6], nums[7], nums[8], chars[2],
nums[9], nums[10], nums[11], chars[3]);
} /* or handle error */
else
fprintf (stderr, "error parsing data from: %s\n", buf);
}
if (fp != stdin) /* close file if not stdin */
fclose (fp);
}
示例输入文件
$ cat dat/splitintoarr.txt
(1231212A, 1231212B) (1231212C, 321128D)
示例使用/输出
$ ./bin/splitintoarr <dat/splitintoarr.txt
123 12 12 A
123 12 12 B
123 12 12 C
321 12 8 D
(已使用字段宽度修饰符输出最终数字的输出,以确保数据的列保持对齐)
请仔细查看所有答案,如果您还有其他问题,请告诉我们。
使用fgets()
从文件中读取一行后,使用sscanf()
包括%n”
分析字符串,以检测扫描了多少。
在格式中使用字符串文字连接也有帮助。
// v---not s
#define GROUP_FMT "%3d%2d%2d%c"
int n = 0;
sscanf(line, " (" GROUP_FMT " ," GROUP_FMT " ) (" GROUP_FMT " ," GROUP_FMT " ) %n",
&nums[0][0], &nums[0][ 1], &nums[0][ 2], &chars[0][0],
&nums[0][3], &nums[0][ 4], &nums[0][ 5], &chars[0][1],
&nums[0][6], &nums[0][ 7], &nums[0][ 8], &chars[0][2],
&nums[0][9], &nums[0][10], &nums[0][11], &chars[0][3], &n);
// Did scanning reach the %n and was that the end of the string?
if (n && line[n] == '\0') Success();
else Fail();
我正在尝试将文件的内容放入数组中。文件内容是正整数和负整数。 这就是我所做的,以确定我应该使数组多大。inFile是我的扫描仪。我能够打印inFile的内容,但它们不会进入数组。我只得到空值。 这就是我试图将文件内容放入数组所做的。 谢谢你的帮助。
我应该在属性文件中添加什么以便它包括。模块文件?
我想将扫描的pdf文件转换为文本可搜索的pdf文件。我想给一个输入扫描的PDF然后我的预期输出是可搜索的PDF。 很少有工具可以将扫描的pdf文件中的文本作为输出,但我希望可以搜索文本的pdf文件作为输出,而不仅仅是文本。 我在这里搜索了一下,找到了一个解决方案,但我的生产服务器是amazon centos,这个工具的安装只适用于ubuntu,不适用于amazon centos。 如果需要,我准备
问题内容: 我想扫描目录树并列出每个目录中的所有文件和文件夹。我创建了一个程序,可从网络摄像机下载图像并将其保存在本地。该程序根据图片的下载时间创建文件树。我现在想扫描这些文件夹并将图像上传到Web服务器,但是我不确定如何扫描目录以查找图像。如果有人可以张贴一些示例代码,那将非常有帮助。 编辑 :我在嵌入式linux系统上运行它,不想使用boost 问题答案: 请参阅以获取简单的“文件树遍历”。我
我需要在一种方法中将文件名作为扫描仪的输入,并在所有其他方法中将该扫描仪用作其余代码的文件路径的引用。 我正在学习文件I/o,对于这个项目,我应该以文件名作为输入,计算文件中的行数,并将每行放入一个数组中。 我的问题出现在FileUtils期间。countRecords方法。在FileUtils中返回文件类型后。打开输入文件(openInputFile),然后将数据放入扫描仪(代码中的变量inf和
我想为这个代码寻求一些帮助。我没有问题读取一个文件本身和使用它作为扫描仪。我可以很容易地数出文件的双倍数。作为一个例子,这些是txt文件的前五个double。(这些数字应该是垂直列出的,但我几乎不怀疑这会有所不同) 这段代码总体上只是打印0.0的“num”数量,而不是将实际数字本身相加。请帮忙,谢谢。