我知道这个问题已被问过几次,但从来没有帮助我弄清楚我的问题。基本上,我正在阅读四个文本文件,所有单个单词由一个新行分隔,并希望将它们存储在一个char数组中。我首先计算文件中的行数,然后创建一个新的char数组,但对于我的生活,我无法弄清楚如何让它正确读取。最后两行只是为了测试它是否正确读取了整个文件,它们总是返回NULL和问号符号。
我希望每一行都在char数组的下一个索引处。
任何帮助都会很棒!提前谢谢你。
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
void countAnagrams(char* fileName);
void main ()
{
char *fileNames[] = {"AnagramA.txt","AnagramB.txt","AnagramC.txt","AnagramD.txt"};
countAnagrams(fileNames[0]);
countAnagrams(fileNames[1]);
countAnagrams(fileNames[2]);
countAnagrams(fileNames[3]);
}
void countAnagrams(char* fileName)
{
int anagramCount = 0;
int ch, lines = 0;
//Count number of lines in file
FILE *myfile = fopen(fileName, "r");
do
{
ch = fgetc(myfile);
if(ch == '\n')
lines++;
}while(ch != EOF);
char contents[lines];
int i = 0;
for(i=1;i<lines;i++)
{
fscanf(myfile,"%s",contents[i]);
}
fclose(myfile);
printf("%.12s\n",fileName);
printf("number of lines: %d\n", lines);
printf("first thing: %s\n", contents[0]);
printf("last thing: %s\n", contents[lines-1]);
}
答案 0 :(得分:2)
以下是对您的代码的轻微修改,可能会对您有所帮助。
要点:
getline()
代替fscanf()
。 fscanf()
可用于逐行读取,但需要显式检查行结束条件。 getline()
会自动执行此操作。 正如kaylum所指出的,在计算行数后,有必要rewind()
将文件指针返回到文件的开头。
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
void countAnagrams(char* fileName);
void main ()
{
char *fileNames[] = {"AnagramA.txt","AnagramB.txt","AnagramC.txt","AnagramD.txt"};
countAnagrams(fileNames[0]);
countAnagrams(fileNames[1]);
countAnagrams(fileNames[2]);
countAnagrams(fileNames[3]);
}
void countAnagrams(char* fileName)
{
int anagramCount = 0;
int ch, lines = 0;
//Count number of lines in file
FILE *myfile = fopen(fileName, "r");
do
{
ch = fgetc(myfile);
if (ch == '\n')
lines++;
} while (ch != EOF);
rewind(myfile);
char *contents[lines];
int i = 0;
size_t len = 0;
for(i = 0; i < lines; i++)
{
contents[i] = NULL;
len = 0;
getline(&contents[i], &len, myfile);
}
fclose(myfile);
printf("%.12s\n",fileName);
printf("number of lines: %d\n", lines);
printf("first thing: %s\n", contents[0]);
printf("last thing: %s\n", contents[lines-1]);
}
答案 1 :(得分:0)
我认为问题是char contents[lines]
然后fscanf(myfile,"%s",contents[i])
和printf
- s之后。 contents[i]
是char
类型,您想要将一个字符数组读入一个字符。 contents
需要声明为char* contents[lines]
才能将char数组读入contents[i]
。