无法扫描C中的文件



我似乎无法用简单的脚本读取文件。我所要做的就是把字母读成一个数组。我只是得到随机的字符,这让我疯了。我在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 = %cn", i, data[i]);
    }

以下代码

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 = %cn", i, data[i]);
    }
    return(0);
} // end function: main

嗯,可能是因为

 &data[1]

应该只是

data

或等效

&data[0]

这很可能是你想要的。

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

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

这里有一个例子:

#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 %sn", 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. 我们检查"文件打开错误"(并相应地返回"非零")

  5. 我们使用"fgets()"来安全地读取一行(而不冒缓冲区溢出的风险)。

如果你想一次读取一个字符,程序可以很简单:

 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++;

第二个例子的一个问题是它没有检查字符串长度>>MAX_LINE。但希望它能给你一些想法。。。

相关内容

  • 没有找到相关文章

最新更新