无法在C中扫描文件

时间:2015-06-27 04:10:50

标签: c file scanf

我似乎无法使用我的简单脚本来读取文件。我想要做的就是将字母读入数组。我只是随机的角色,这让我发疯。我在Debug文件夹中有文件,还有什么可能出错?我百分百肯定一切都是正确的。

这是我的代码:

FILE * ifp;
   ifp = fopen("letters.txt", "r");


   int i;
   int bound = 20;
   char data[20];


    for(i =0; i<bound; i++){
        fscanf(ifp, "%s", &data[1]);
        if (ifp == NULL){
            return;
        }
        printf("Data %d = %c\n", i, data[i]);

    }

3 个答案:

答案 0 :(得分:2)

以下代码

1) checks for errors
2) compiles cleanly
3) works on a test.txt file I produced.

#include <stdio.h>
#include <stdlib.h>

#define bound (20)

int main( void )
{
    FILE * ifp;

    if( NULL == (ifp = fopen("letters.txt", "r") ) )
    { // then, fopen failed
        perror( "fopen for letters.txt failed");
        exit( EXIT_FAILURE );
    }

    // implied else, fopen successful


    int i;

    char data[bound];


    for(i =0; i<bound; i++)
    {
        if( 1 != fscanf(ifp, "%c", &data[i]) )
        { // then fscanf failed
            perror( "fscanf failed" );
            exit( EXIT_FAILURE );
        }

        // implied else, fscanf successful

        printf("Data %d = %c\n", i, data[i]);
    }
    return(0);
} // end function: main

答案 1 :(得分:0)

嗯,可能是因为

 &data[1]

应该只是

data

或等效的

&data[0]

这很可能是你想要的。

我能想到的另一个原因是,你正在阅读的行超过20个字符并且它溢出了数据数组。

看一下这个例子:http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm

答案 2 :(得分:0)

以下是一个例子:

#include <stdio.h>

#define MAX_LINES 10
#define MAX_LINE  80
#define FILE_NAME "lines.txt"

int
main (int argc, char *argv[])
{
  char lines[MAX_LINES][MAX_LINE];
  FILE *fp;
  int i = 0;

  if (!(fp = fopen(FILE_NAME, "r"))) {
    perror ("file open error");
    return 1;
  }

  while (i < MAX_LINES) {
    if (fgets (lines[i], MAX_LINE, fp)) {
      printf ("Line[%d]=%s", i, lines[i]);
      i++;
    } else {
      printf ("End of file: closing %s\n", FILE_NAME);
      break;
    }
  }
  fclose (fp);
  return 0;
}

示例输出:

$ gcc -o x1 -Wall -pedantic -g x1.c
$ ./x1
Line[0]=Come and listen to my story
Line[1]='Bout a man named Jed
Line[2]=Poor mountaineer,barely kept his fam'ly fed
End of file: closing lines.txt

注意:

  1. 我们一次只读一行

  2. 我们将每行读入数组

  3. 我们提前定义数组中的#/元素(MAX_LINES)和每个字符串的最大大小(MAX_LINE)

  4. 我们检查&#34;文件打开错误&#34; (并返回&#34;非零&#34;相应地)

  5. 我们使用&#34; fgets()&#34;安全地读取一行(不用担心缓冲区溢出)。

  6. 如果您想一次阅读一个角色,该程序可以像以下一样简单:

     char string[MAX_LINE], *c;
     ...
     if (!(fp = fopen(FILE_NAME, "r"))) {
        perror ("file open error");
        return 1;
     }
     ...     
     c = string;
     while ((*c = fgetc (fp)) != EOF)
        c++;
    

    第二个例子的一个问题是它没有检查字符串长度&gt;&gt; MAX_LINE。但希望它有助于给你一些想法......