![](/img/trans.png)
[英]How to separate binary strings from text file and store them in 1d or 2d char array?
[英]How to get the strings from a file and store in a 2D char array and compare that 2D char array with a string in C?
我有一个文本文件,它的值(我通常称其为upc_values)为
01080006210
69685932764
40000114485
40000114724
07410855329
72908100004
66484101000
04000049163
43701256600
99999909001
07726009493
78732510053
78732510063
78732510073
78732510093
02842010109
02842010132
78732510213
02410011035
73999911110
char *UPC_val = "99999909001";
char upcbuf[100][12];
char buf[12];
memset(buf,0,sizeof(buf));
memset(upcbuf,0,sizeof(upcbuf));
当我尝试获取fget时,我将其存储在2D缓冲区中。
while ( fgets(buf, sizeof(buf), f) != NULL ) {
strncpy(upcbuf[i], buf, 11);
i++;
}
我试图在缓冲区中打印数据。
puts(upcbuf[0]);
upcbuf [0]在连续流中具有整个数据,
0108000621069685932764400001144854000011472407410855329729081000046648410100004000049163437012566009999990900107726009493787325100537873251006378732510073787325100930284201010902842010132787325102130241001103573999911110
我想将此upc值(11位)与另一个字符串(11位)进行比较。 我用了,
if(strncmp(UPC_Val,upcbuf[i],11) == 0)
{
//do stuff here
}
它工作不正常,我也使用strstr(),
if(strstr(upcbuf[0],UPC_val) != NULL)
{
//do stuff here
}
我完全不知道它在做什么,我是否在正确进行比较? 怎么做,有什么帮助吗?
提前致谢。
要将11位数字的文本行和'\\n'
读入字符串中,需要至少13个数组来存储该字符串 。 没有什么理由要那么紧。 建议两倍最大尺寸
char upcbuf[100][12]; // large enough for 100 * (11 digits and a \0)
...
#define BUF_SIZE (13*2)
char buf[BUF_SIZE];
while (i < 100 && fgets(buf, sizeof buf, f) != NULL ) {
挖掉潜在的尾巴'\\n
'
size_t len = strlen(buf);
if (len && buf[len-1] == '\n') buf[--len] = '\0';
检查长度并以某种方式处理。
if (len != 11) exit(EXIT_FAILURE);
保存/打印数据
// strncpy(upcbuf[i], buf, 11); // fails to insure a null character at the end
strcpy(upcbuf[i], buf);
i++;
puts(upcbuf[i]);
比较字符串
if(strcmp(UPC_Val,upcbuf[i]) == 0) {
// strings match
}
如果您仍然无法在@chux的答案之后使逻辑正常工作,那么以下是一个简短的示例,该示例实现了他的建议:将文件名读取为第一个参数,可选地将upc搜索为第二个参数(它将默认情况下,搜索"99999909001"
(在这种情况下,您只需在stdin
上读取文件即可))。
注意使用enum
为行和列值定义全局常量。 (如果愿意,可以使用独立的#define ROW 128
和#define COL 32
)如果需要在代码中定义常量,请在顶部对其进行一次定义,因此,如果需要更改,则可以在一个方便的位置进行更改值,而不必仔细检查代码或执行全局搜索/替换以更改它们。
例如,您可以将逻辑汇总如下:
#include <stdio.h>
#include <string.h>
enum { COL = 32, ROW = 128 }; /* an enum is convenient for constants */
int main (int argc, char **argv) {
char buf[COL] = "", /* buffer to read each line */
upcbuf[ROW][COL] = { "" }, /* 2D array of ROW x COL chars */
*upcval = argc > 2 ? argv[2] : "99999909001";
size_t n = 0; /* index/counter */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin; /* file */
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
/* fill upcbuf (you could search at same time, but let's fill) */
while (n < ROW && fgets (buf, COL, fp)) {
size_t len = strlen (buf); /* get length */
/* test last char '\n', overwrite w/nul-terminating char */
if (len && buf[len - 1] == '\n')
buf[--len] = 0;
strcpy (upcbuf[n++], buf); /* copy to upcbuf */
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
/* step through upcbuf - search for upcval */
for (size_t i = 0; i < n; i++)
if (strcmp (upcbuf[i], upcval) == 0) {
printf ("upcval: '%s' found at line '%zu'.\n", upcval, i + 1);
return 0;
}
printf ("upcval: '%s' not found in file.\n", upcval);
return 0;
}
使用/输出示例
$ ./bin/upcbuf dat/upcfile.txt
upcval: '99999909001' found at line '10'.
$ ./bin/upcbuf dat/upcfile.txt 01080006210
upcval: '01080006210' found at line '1'.
$ ./bin/upcbuf dat/upcfile.txt 02410011035
upcval: '02410011035' found at line '19'.
$ ./bin/upcbuf dat/upcfile.txt "not there!"
upcval: 'not there!' not found in file.
还要注意,如果您只是在搜索单个upc,则可以在一个循环中组合读取和搜索,但是由于您通常将读取作为一个单独的函数,然后对代码中其他位置的数据进行操作,因此本示例仅读取了将文件中的所有upc值放入您的数组,然后在单独的循环中搜索数组。 查看所有内容,查看所有答案,如果还有其他问题,请告诉我们。
最后一点,您已经检查了最后一个字符是否为'\\n'
,但是如果不是,该怎么办? 您应该检查长度是否为COL-1
指示该行中的其他字符仍未读取并处理错误(或仅读取并丢弃其余字符)。 您可以通过添加类似于以下内容的方法来做到这一点:
/* test last char '\n', overwrite w/nul-terminating char */
if (len && buf[len - 1] == '\n')
buf[--len] = 0;
else if (len == COL - 1) { /* if no '\n' & len == COL - 1 */
fprintf (stderr, "error: line excces %d chars.\n", COL - 1);
return 1;
}
并且,您需要使用else if
并检查COL - 1
而不是仅在此处使用else
,因为在此之后,您可能正在从没有POSIX行尾 (例如换行符)的文件中进行读取文件的最后一行。 即使没有POSIX行结尾, fgets
也会正确读取最后一行,但是buf
不会有'\\n'
。 因此,即使没有POSIX行结尾,该行也可以是有效行,并且只要读取的字符数(+以nul终止的 char)不等于缓冲区大小,就可以保证读取完整。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.