所以我正在尝试编写一个程序,它将读取一个文件并存储到一个结构中,以便以后可以将它传递给其他函数进行操作等等。但是,当我尝试访问此文件以用于以后的功能时,似乎没有任何存储/缓冲。问题似乎出现在“void readFile”函数中。这是我到目前为止所做的:
示例输入: 玛丽有一只小羊羔 玛丽有只小羊羔, 他的羊毛像雪一样白。
我的调试会正确打印出来,但重复最后一行。
struct info{
int numOfLines;
char lines[];
}
int main (int argc, char * argv[]){
int words, sentences, syllables;
int index = 0;
struct info lines[200];
FILE* inFile = NULL;
inFile = findFile(argv[1]);
readFile(inFile,lines);
fclose(inFile);
return 0;
}
FILE* findFile(char fileName[]){
FILE* fileIn = NULL;
fileIn = fopen(fileName, "r");
while(fileIn == NULL){
printf("That file does not exist or was unable to be found, please enter another\n");
fgets(fileName,100,stdin);
fopen(fileName, "r");
}
return fileIn;
}
void readFile(FILE* toRead, struct info lines[]){
char sentence[200];
int i = 0;
while(!feof(toRead)){
fgets(sentence,300,toRead); //Would this be better than fread()?
strcpy(lines[i].lines,sentence);
printf("%s",lines[i].lines); //*This is a debug statement. The lines are read properly except the last line is printed twice. not sure why.
i++;
}
}
编辑:现在回过头来看,使用指针代替字符串数组会更好吗?
答案 0 :(得分:1)
所以即使它有点模糊,我也会尝试回答你的问题。 所以关于你的问题,我不知道你是否正在尝试读出一个充满“Info structs”的文件,或者试图从text / bin文件中读取'x'个char到一个struct中。
首先在代码中看到的一些常见内容。
FILE* findFile(char fileName[])
有点不必要。到目前为止,我可以看到您正在尝试查看该文件是否存在。您可以通过使用“acces()”来执行此操作,此函数检查调用进程是否访问文件路径名。实施将像这样If(access(pathOfFile, F_OK) == 0){}
。请阅读此链接以获取更多信息https://linux.die.net/man/2/access。char sentence[200];
fgets(sentence,300,toRead); //Would this be better than fread()?
之后,您声明了一个大小为200的字符数组,然后您尝试从该文件中读取它,但您尝试读取的数量为300,因此这将永远不会因为你要在数组之外写作而工作。提示阅读“man”页面,你可以通过输入你的linux终端“man fread”来做到这一点,用其他函数名替换fread。喜欢“访问”。这些我想要清理的两点。
关于你的问题,我将给你一个从文件中读取结构的例子。因为如果你试图从文件或结构中读取一些字符,你的问题So I am trying to write a program that will read a file and store into a struct, such that it can be later on passed to other functions for manipulation and whatnot.
有点模糊。所以我重写了你的程序,从一个充满INFO结构的文件中读取结构,然后你可以用来操作它。
代码段将数据从结构文件读取到结构数组中
#include <stdio.h>
#include <unistd.h>
#define file_name "Foo_File"
struct INFO{
char ar[200];
}
int main (int argc, char * argv[]){
if(access(file_name, F_OK) != 0{
printf("File does not exist");
return -1;//Exit program with -1, error
}
int structs = get_Amount_Of_Structs(file_name);
INFO info_array[structs];//Make an array of info structs, same amount of structs as in file
for(int i = 0; i < structs; i++){
readDataStructFromFile(file_name, info_array, i);
}
return 0;
}
/*
This function will calculate the total byte size of the file by diving this through the byte size of one struct you are able to know the amount of structs.
*/
int get_Amount_Of_Structs(char* filename)
{
FILE* fp = fopen(filename, "r");
if(fp == NULL){//If File pointer is null opening failed
return -1;
}
fseek(fp, 0L, SEEK_END);
int amountOfStructs = ftell(fp)/sizeof(INFO);
fseek(fp, 0L, SEEK_SET);
fclose(fp);
return amountOfStructs;
}
/*
This function reads a struct from a file at the position "pos" by slight modification you can make it read the whole file into a pointer that points to an array of INFO structs
*/
int readDataStructFromFile(char* filename, INFO* data, int pos)
{
FILE* fp = fopen(filename, "r");
if(fp == NULL)
{
fclose(fp);
return -1;
}
fseek(fp, (pos * sizeof(INFO)), SEEK_SET);
int rv = fread(data, sizeof(INFO), 1, fp);
fclose(fp);
if(rv == 1)
{
return 0;
}
return -1;
}
我希望这至少可以帮助您解决代码问题。关于“fgets vs fread”问题已经被另一个问题解决了。 希望我能对你的问题给出一个更完整的答案,但这有点模糊。
P.S。如果社区中的任何人看到我的代码/解释中的错误,请随时编辑或指出我的错误。我是学生,所以总有一些人需要学习。
答案 1 :(得分:0)
fgets(fileName,100,stdin);
fopen(fileName, "r");
fgets
包含尾随换行符,在使用fopen
之前删除它:
char *ptr;
fgets(fileName,100,stdin);
if (ptr = strchr(filename, '\n') {
*ptr = '\0';
}
还要注意你需要
fileIn = fopen(fileName, "r");
而不是
fopen(fileName, "r");