搜索和阅读文本文件

时间:2013-09-23 22:47:46

标签: c scanf

这是我第一次在这里问一个问题,所以我会努力做到最好。我在C上不是很好,我只是在中级C编程中。

我正在尝试编写一个读取文件的程序,我正在使用它。但是我已经搜索了一个单词,然后将单词保存到数组中。我现在要做的是

for(x=0;x<=256;x++){
 fscanf(file,"input %s",insouts[x][0]);
 }

在文件中有一行说“输入A0;”我希望它将“A0”保存到insouts [x] [0]。 256只是我选择的数字,因为我不知道文本文件中可能有多少输入。

我的声明声明为:

char * insouts[256][2];

3 个答案:

答案 0 :(得分:0)

您希望传递数组的第x个元素的地址,而不是存储在那里的值。您可以使用地址运算符&来执行此操作。

我认为

 for(x = 0;x < 256; x++){
     fscanf(file,"input %s", &insouts[x][0]); 
     // you could use insouts[x], which should be equivalent to &insouts[x][0]
 }

可以做到这一点:)

此外,您只为每个字符串分配2个字节。请记住,字符串需要以空字符结束,因此您应该将数组分配更改为

char * insouts[256][3];

但是,我很确定%s会匹配A0;而不仅仅是A0,所以您可能也需要考虑到这一点。您可以将%c与宽度一起使用来读取给定数量的字符。但是,您添加以自己添加空字节。这应该有效(未经测试):

char* insouts[256][3];
for(x = 0; x < 256; x++) {
    fscanf(file, "input %2c;", insouts[x]);
    insouts[x][2] = '\0';
}

答案 1 :(得分:0)

而不是尝试使用fscanf为什么不使用“getdelim”和';'作为分隔符。 根据手册页

“getdelim()的工作方式与getline()类似,不同之处在于可以将除换行符之外的行分隔符指定为分隔符参数。与getline()一样,如果输入中不存在分隔符,则不添加分隔符。文件结束了。“

所以你可以做类似的事情(未经测试和未编译的代码)

char *line = NULL;
size_t n, read;
int alloc = 100;
int lc = 0;
char ** buff = calloc(alloc, sizeof(char *)); // since you don't know the file size have 100 buffer and realloc if you need more
FILE *fp = fopen("FILE TO BE READ ", "r");
int deli = (int)';';
while ((read = getline(&line, &n, fp)) != -1) {
   printf("%s", line); // This should have "input A0;" 
   // you can use either sscanf or strtok here and get A0 out 
   char *out = null ;
   sscanf(line, "input %s;", &out);
   if (lc > alloc) {
      alloc = alloc + 50;
      buff = (char **) realloc(buff, sizeof(char *) * alloc);
   }
   buff[lc++] = out
}

int i = 0 ; 
for (i = 0 ; i < lc; i++)
   printf ("%s\n", buff[i]);

答案 2 :(得分:0)

使用fgets()&amp; sscanf()。从格式扫描中分离I / O.

#define N (256)
char insouts[N][2+1]; // note: no  * and 2nd dimension is 3
for(size_t x = 0; x < N; x++){
   char buf[100];
   if (fgets(buf, sizeof buf, stdin) == NULL) {
     break;  // I/O error or EOF
   }
   int n = 0;
   //  2 this is the max length of characters for insouts[x].  A \0 is appended.
   //  [A-Za-z0-9]  this is the set of legitimate characters for insouts
   // %n record the offset of the scanning up to that point.
   int result = sscanf(buf, "input %2[A-Za-z0-9]; %n", insouts[x], &n);
   if ((result != 1) || (buf[n] != '\0')) {
      ; // format error
   }
}