我在学校学习C,我在学习如何阅读文件时遇到了问题。
这个问题不是家庭作业,而是我正在编写的一本书中的练习练习。
我的文件是一个名为Letters.txt的.txt文件。
它包含这些内容中的所有数据:'#Alphabet.123.45ABCDEFGHIJKLMNOPQRSTUVWXYZ'。
有'>'符号,然后是字母,然后是(。)然后是123,然后是(。)然后是45,然后是'ABCDEFGHIJKLMNOPQRSTUVWXYZ'。
我遇到的第一个问题是,当我尝试读取文件并将其打印到屏幕上以查看我是否正确阅读时,我的控制台只打印出MZÉ。我不知道那是什么。
我的代码是:
FILE *fp;
char *fname;
fname = "Letters.txt";
fp = fopen(fname, "r");
char *buff[100];
fscanf(fp, "%s", buff);
printf("%s", buff);
fclose(fp);
其次,实际的练习应该是将这个输入分成单独的变量:
丢弃初始字符,带有Alphabet.123.45的字符串和带有'ABCDEFGHIJKLMNOPQRSTUVWXYZ'的字符串。
我一直在网上找到REGEX教程,但我并不熟悉那些。作为参考,我以前只精通Java,Javascript,PHP,MySQL和JQuery。
答案 0 :(得分:1)
我在这里看到了几个问题。
fscanf
返回的值。如果是负数,则表示您有错误。如果是正数,则表示读入的字符数。如果该数字大于100,则表示您已覆盖缓冲区(错误)。*
之前的buff
,因为你想要一个字符串数组,而不是指向一个字符串数组的指针。通常,在c中处理库函数时,应检查负数的所有返回值。如果您收到负数,则应致电get_errno()
以查看问题所在。例如,在打开文件时,可能由于不同原因而无法打开,并且您的程序可能希望根据open()
调用失败的原因执行不同的操作。
答案 1 :(得分:0)
在buff
之前删除星号,然后它应该可以正常工作!此外,您必须检查if(fp!=NULL)
以查看文件是否已打开
答案 2 :(得分:0)
您需要检查fopen的返回值,以确保它已成功打开文件。如果它失败了,你将从fscanf获得垃圾回收。 fscanf也返回一个你应该检查的有用值
答案 3 :(得分:0)
#include <stdio.h>
int main(){
FILE *fp;
char *fname = "Letters.txt";
fp = fopen(fname, "r");
char buff[100];
fscanf(fp, "%99s", buff);
printf("%s\n", buff);
fclose(fp);
char field[4][32];
sscanf(buff, "%*c%31[A-Za-z].%31[0-9].%31[0-9]%31s", field[0], field[1], field[2],field[3]);
printf("%s\n", field[0]);
printf("%s\n", field[1]);
printf("%s\n", field[2]);
printf("%s\n", field[3]);
return 0;
}