文件到字符串数组(逐行)

MatjažMav

我有文本文件,我想将每一行保存到字符串数组(全局定义为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;
}

此功能的问题:

  1. 的返回值char*与return语句不兼容return array;array可以被视为char (*)[MAX_ROW_LENTH],但不能被视为char*

  2. 即使使返回类型和return语句匹配,主要的问题是您试图返回一个指向该函数返回时将被删除的对象的指针。指针在调用函数中将无效。

  3. 线

        strcpy(array[i], lineToString(filename, i));
    

    应该

        strcpy(array[i-1], lineToString(filename, i));
    

    由于C中的数组索引以开头0,而不是1

其他问题:

  1. 您正在为stringin分配内存lineToString但没有取消分配内存

  2. 您正在为fileAin分配内存main但没有取消分配内存

以下版本fileToArraymain与我的测试一起使用。我尝试尽可能保留您的代码,并修改了我认为绝对必要的内容。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

逐行读取文件并将值存储到数组/字符串中?

来自分类Dev

逐行读取文件并将值存储到数组/字符串中?

来自分类Dev

Bash,逐行读取,逐行拆分字符串除以“,”,存储到数组

来自分类Dev

逐行将文件读取到C语言中的字符串数组中

来自分类Dev

数组到字符串

来自分类Dev

Swift文本文件到字符串数组

来自分类Dev

Android字符串数组从xml文件到ListView

来自分类Dev

将字符串文件存储到动态数组中

来自分类Dev

如何从文件中读取行到字符串数组?

来自分类Dev

查询字符串到php数组并记录到文件

来自分类Dev

十六进制文件到字符串数组?

来自分类Dev

数组的输出值到文件中的字符串

来自分类Dev

数组到字符串的转换:用户迁移文件

来自分类Dev

C/ 从文件到数组的字符串数据。分段故障

来自分类Dev

PHP逐行获取文件并与字符串进行比较

来自分类Dev

逐行读取文件时如何跳过字符串

来自分类Dev

bash文件与选定字符串的逐行比较

来自分类Dev

逐行读取文件并放入其他字符串

来自分类Dev

在Ruby中逐行比较文件中的字符串

来自分类Dev

PHP逐行读取大文件并替换字符串

来自分类Dev

bash文件与选定字符串的逐行比较

来自分类Dev

字符串数组到 json 数组

来自分类Dev

字符串到字符数组

来自分类Dev

如何从文本文件中逐行读取并将这些字符串添加到数组中?

来自分类Dev

用户输入字符串到字符串数组

来自分类Dev

多行字符串到数组

来自分类Dev

多维数组到字符串的转换

来自分类Dev

数组到字符串的转换错误?

来自分类Dev

ifstream字符串的getline到数组?