因此,我必须编写一个程序,使用指向main中创建的数组的指针,提示用户输入文件名,然后将其打开。在一个单独的函数中,我必须将用户定义的字符串带到在main中打开的文件中,并根据其在循环中读取的字符串的个数返回文件中的行数,并将该值返回给调用者。
这是我的第一个功能。
void getFileName(char* array1[MAX_WIDTH])
{
FILE* data;
char userIn[MAX_WIDTH];
printf("Enter filename: ");
fgets(userIn, MAX_WIDTH, stdin);
userIn[strlen(userIn) - 1] = 0;
data = fopen(userIn, "r");
fclose(data);
return;
}
我的第二个功能是这个。
int getLineCount(FILE* data, int max)
{
int i = 0;
char *array1[MAX_WIDTH];
if(data != NULL)
{
while(fgets(*array1, MAX_WIDTH, data) != NULL)
{
i+=1;
}
}
printf("%d", i);
return i;
}
我主要是这个。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_WIDTH 144
void getFileName(char* array1[MAX_WIDTH]);
int getLineCount(FILE* data, int max);
int main(void)
{
char *array1[MAX_WIDTH];
FILE* data = fopen(*array1, "r");
int max;
getFileName(array1);
getLineCount(data, max);
return 0;
}
我的文本文件是这个。
larry snedden 123 mocking bird lane
sponge bob 321 bikini bottom beach
mary fleece 978 pasture road
hairy whodunit 456 get out of here now lane
我的问题是,每次运行此命令时,我总是得到0作为回报,我不认为那是我应该得到的回报。另外,在我的第二个函数中,我不知道为什么在那里需要int max,但是我的老师向我发送了它,所以如果有人可以解释这一点,那就太好了。我真的不知道我在做什么错。我将不胜感激。
答案 0 :(得分:1)
发布的代码存在许多问题。我已经修复了代码中的问题,并留下了一些注释来描述我的所作所为。我确实认为该代码可以通过一些重组和重命名而受益(例如array1不能告诉您变量的目的是什么)。对于超过MAX_WIDTH的行,getLineCount()函数是无效的,应该重写它以计算实际行,而不仅仅是对fgets的调用。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_WIDTH 144
/**
* Gets a handle to the FILE to be processed.
* - Renamed to indicate what the function does
* - removed unnecessary parameter, and added return of FILE*
* - removed the fclose() call
* - added rudimentary error handling.
**/
FILE *getFile()
{
char userIn[MAX_WIDTH+1];
printf("Enter filename: ");
fgets(userIn, MAX_WIDTH, stdin);
userIn[strlen(userIn) - 1] = 0; // chop off newline.
FILE *data = fopen(userIn, "r");
if (data == NULL) {
perror(userIn);
}
return data;
}
/**
* - removed the unnecessary 'max' parameter
* - removed null check of FILE *, since this is now checked elsewhere.
* - adjusted size of array1 for safety.
**/
int getLineCount(FILE* data)
{
int i = 0;
char array1[MAX_WIDTH+1];
while(fgets(array1, MAX_WIDTH, data) != NULL)
{
i+=1;
}
return i;
}
/**
* - removed unnecessary array1 variable
* - removed fopen of uninitialized char array.
* - added some rudimentary error handling.
*/
int main(void)
{
FILE *data = getFile();
if (data != NULL) {
int lc = getLineCount(data);
fclose(data);
printf("%d\n", lc);
return 0;
}
return 1;
}
答案 1 :(得分:0)
我认为您首先应该修复几件事:
getFileName应该可以帮助您获取文件名(顾名思义),因此在该函数中您不应同时拥有array1和userIn(事实上,甚至在该函数中也没有使用array1,因此可以消除所有togheter)。参数和文件名应为“相同”。
data是本地FILE指针,这意味着一旦退出函数,它就会丢失。我的建议是使其全局化,或将其作为主类的参数传递。也不要在打开后关闭它的第一行。
我猜想getLineCount很好,但是通常这样做是一种很好的做法,可以在返回的结果中使用printf。
传递给第二个函数的最大值可能会帮助您获得一行的最大大小?可能是这样。
总而言之,您的getFileName应该返回文件名,以便该参数应由userIn来指定。文件的打开应在“主要功能”中完成,并在您完成与文件相关的所有操作后将其关闭,因此请在最后。另外,打开文件后,您将获得文件名。
希望它对您有所帮助!让我们随时了解您的进度。