我有文本文件,我想将每一行保存到字符串数组(全局定义为fileA
)。我所知道的是,文件中的所有行都短于101个字符。我做了3个功能:
char * lineToString(char * filename, int line)
-所选行的返回值int getLineCount(char * filename)
-返回文件中的行数(计数形式1)char * fileToArray(char * filename)
-返回字符串数组我认为此功能可以正常工作,问题出在中main()
。我sizeof(...)
只是为了调试而打印的。我的代码中也有很多警告,我该如何解决?
谢谢!
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int MAX_LINES = 1000; //0 <= x && x < 1000
int MAX_ROW_LENGTH = 101; //100 + 1 ('\0')
char * fileA = NULL;
char * lineToString(char * filename, int line){
FILE * file = fopen(filename, "r");
int currLine = 1;
int currCol = 0;
char currChar;
char * string = (char *) malloc(sizeof(char)*MAX_ROW_LENGTH);
string[0] = '\0';
if(file != NULL && line >= 1){
while((currChar = getc(file)) != EOF){
if(currLine == line){
if(currChar == '\n'){
string[currCol] = '\0';
break;
}else{
string[currCol] = currChar;
currCol++;
}
}
if(currChar == '\n') currLine++;
}
fclose(file);
}
return string;
}
int getLineCount(char * filename){
FILE * file = fopen(filename, "r");
int count = 0;
char c;
if(file != NULL){
while((c = getc(file)) != EOF)
if(c == '\n') count++;
fclose(file);
}
return count;
}
char * fileToArray(char * filename){
int i;
int lineCount = getLineCount(filename);
char array[lineCount][MAX_ROW_LENGTH];
for(i = 1; i <= lineCount; i++){
strcpy(array[i], lineToString(filename, i));
//printf("%s\n", array[i]);
}
printf("%d\n",sizeof(array));
return array;
}
int main(int argc, char **argv){
fileA = (char *) malloc(sizeof(fileToArray(argv[1])));
strcpy(fileA, fileToArray(argv[1]));
printf("%d\n", (int) sizeof(fileA));
int i;
for(i = 0; i < (int) sizeof(fileA); i++){
printf("%s\n", fileA[i]);
}
return 0;
}
安慰:
matjazmav:~/FRI13_14/SE02/P2/DN/DN08$ gcc 63130148-08.c -o 63130148-08
63130148-08.c: In function ‘fileToArray’:
63130148-08.c:58:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat]
63130148-08.c:59:2: warning: return from incompatible pointer type [enabled by default]
63130148-08.c:59:2: warning: function returns address of local variable [enabled by default]
63130148-08.c: In function ‘main’:
63130148-08.c:69:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
matjazmav:~/FRI13_14/SE02/P2/DN/DN08$ ./63130148-08 input-1a input-1b
808
8
Segmentation fault (core dumped)
我看到的一个问题是您需要移动生产线
if(currChar == '\n') currLine++;
在while循环中。
当我使用一台成熟的计算机而不是平板电脑时,我还可以描述一些其他问题。
更新
你有
char * fileToArray(char * filename){
int i;
int lineCount = getLineCount(filename);
char array[lineCount][MAX_ROW_LENGTH];
for(i = 1; i <= lineCount; i++){
strcpy(array[i], lineToString(filename, i));
//printf("%s\n", array[i]);
}
printf("%zu\n",sizeof(array));
return array;
}
此功能的问题:
的返回值char*
与return语句不兼容return array;
。array
可以被视为char (*)[MAX_ROW_LENTH]
,但不能被视为char*
。
即使使返回类型和return语句匹配,主要的问题是您试图返回一个指向该函数返回时将被删除的对象的指针。指针在调用函数中将无效。
线
strcpy(array[i], lineToString(filename, i));
应该
strcpy(array[i-1], lineToString(filename, i));
由于C中的数组索引以开头0
,而不是1
。
其他问题:
您正在为string
in分配内存,lineToString
但没有取消分配内存。
您正在为fileA
in分配内存,main
但没有取消分配内存。
以下版本fileToArray
和main
与我的测试一起使用。我尝试尽可能保留您的代码,并修改了我认为绝对必要的内容。
void fileToArray(char * filename, int lineCount, char (*array)[MAX_ROW_LENGTH])
{
int i;
char* string;
for(i = 1; i <= lineCount; i++){
string = lineToString(filename, i);
strcpy(array[i-1], string);
free(string);
}
}
int main(int argc, char **argv)
{
int i;
int lineCount = getLineCount(argv[1]);
char array[lineCount][MAX_ROW_LENGTH];
fileToArray(argv[1], lineCount, array);
for(i = 0; i < lineCount; i++){
printf("%s\n", array[i]);
}
return 0;
}
PS由詹姆斯- [R伙计在他的回答提出的意见是非常有效的。仅为了获取一行文本而打开和关闭文件的成本很高。希望您找到一种在代码中纳入他的建议的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句