我似乎无法用简单的脚本读取文件。我所要做的就是把字母读成一个数组。我只是得到随机的字符,这让我疯了。我在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
注:
我们一次读一行
我们正在将每一行读取到阵列中
我们提前定义数组中的#/元素(MAX_LINES)和每个字符串的最大大小(MAX_LINE)
我们检查"文件打开错误"(并相应地返回"非零")
我们使用"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。但希望它能给你一些想法。。。