Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中CSV到2D数组的转换_C - Fatal编程技术网

C语言中CSV到2D数组的转换

C语言中CSV到2D数组的转换,c,C,这对我来说是一个非常有趣的错误,因为一小时前这段代码还可以正常工作,但现在不行了 从本质上讲,下面一行的第一个“块”的第一个字符被追加为最后一个“块”的最后一个字符 其中“block”是指该行/列中的字符串 例如,假设数组应该是 1,2,3,Hello 4,5,6,Wonder 它被解读为 1,2,3,Hello4, 6,Wonder, , 这是我一直使用的逻辑。我真的不知道发生了什么变化,所以任何建议都是非常好的 tableFile = fopen(argv[4], "r"); //

这对我来说是一个非常有趣的错误,因为一小时前这段代码还可以正常工作,但现在不行了

从本质上讲,下面一行的第一个“块”的第一个字符被追加为最后一个“块”的最后一个字符

其中“block”是指该行/列中的字符串

例如,假设数组应该是

1,2,3,Hello
4,5,6,Wonder
它被解读为

1,2,3,Hello4,
6,Wonder, , 
这是我一直使用的逻辑。我真的不知道发生了什么变化,所以任何建议都是非常好的

tableFile = fopen(argv[4], "r");


//pulling the table data from the file
char tableArray[30][50][256];
char c;
int i=0, j=0, k=0;
while(c != EOF){

    c = fgetc(tableFile);

    switch(c)
    {
        case ',':
            tableArray[i][j++][k]='\0';
            k=0;
            break;
        case '\n':
            tableArray[i++][j][k]='\0';
            j=0;
            k=0;
            break;
        case '\r':
            break;
        case EOF:
            break;
        default:
            tableArray[i][j][k++] = c;
            break;
    }

} //end file transfer

//Just to display, ignore magic numbers as (mostly) irrelevant
int a, b;

for (a = 0; a < 20; a++)
{
    for (b = 0; b < 47; b++)
    {
        printf ("%s", tableArray[a][b]);
        if (b<46)
            printf (", ");

    }
    printf ("\n");
}

fclose(tableFile);
tableFile=fopen(argv[4],“r”);
//从文件中提取表数据
字符表数组[30][50][256];
字符c;
int i=0,j=0,k=0;
而(c!=EOF){
c=fgetc(表格文件);
开关(c)
{
案例',':
tableArray[i][j++][k]='\0';
k=0;
打破
案例“\n”:
tableArray[i++][j][k]='\0';
j=0;
k=0;
打破
案例'\r':
打破
案例EOF:
打破
违约:
tableArray[i][j][k++]=c;
打破
}
}//结束文件传输
//只是为了显示,忽略魔术数字(大部分)是不相关的
INTA,b;
对于(a=0;a<20;a++)
{
对于(b=0;b<47;b++)
{
printf(“%s”,表数组[a][b]);
如果(b)
  • 您没有初始化数组。数组不能保证为零填充。添加

    memset(tableArray,0,sizeof(tableArray))

  • 案例EOF:
    必须在最近的字符串中添加一个
    NULL
    终止符


  • 这真的是由于我的原始帖子下面的评论。但是,尽管这是一种令人厌恶且糟糕的编码形式……但这是始终如一地解决它的原因,并不是因为我为此感到自豪……而且我仍然愿意接受各种想法:

    tableFile = fopen(argv[4], "r");
    
    //pulling the table data from the file, lazy magic numbers here... 
    char tableArray[30][50][256];
    char c;
    int i=0, j=0, k=0;
    
    memset(tableArray, 0, sizeof(tableArray));
    while(c != EOF){
    
        c = fgetc(tableFile);
    
        switch(c)
        {
            case ',':
                tableArray[i][j++][k]='\0';
                k=0;
                break;
            case '\n':
                tableArray[i++][j][k]='\0';
                j=0;
                k=0;
                break;
            case '\r':
                tableArray[i++][j][k]='\0';
                j=0;
                k=0;
                break;
            case EOF:
                tableArray[i][j][k] = '\0';
                break;
            default:
                tableArray[i][j][k++] = c;
                break;
        }
    
    } //end file transfer
    
    /* //Only relevant for displaying the tableArray
    int a, b;
    
    for (a = 0; a < 20; a++)
    {
        for (b = 0; b < 47; b++)
        {
            printf ("%s", tableArray[a][b]);
            if (b<46)
                printf (", ");
    
        }
        printf ("\n");
    }
     */
    
    fclose(tableFile);
    
    tableFile=fopen(argv[4],“r”);
    //从文件中提取表数据,这里是惰性幻数。。。
    字符表数组[30][50][256];
    字符c;
    int i=0,j=0,k=0;
    memset(tablerarray,0,sizeof(tablerarray));
    而(c!=EOF){
    c=fgetc(表格文件);
    开关(c)
    {
    案例',':
    tableArray[i][j++][k]='\0';
    k=0;
    打破
    案例“\n”:
    tableArray[i++][j][k]='\0';
    j=0;
    k=0;
    打破
    案例'\r':
    tableArray[i++][j][k]='\0';
    j=0;
    k=0;
    打破
    案例EOF:
    tableArray[i][j][k]='\0';
    打破
    违约:
    tableArray[i][j][k++]=c;
    打破
    }
    }//结束文件传输
    /*//仅与显示tableArray相关
    INTA,b;
    对于(a=0;a<20;a++)
    {
    对于(b=0;b<47;b++)
    {
    printf(“%s”,表数组[a][b]);
    
    如果(b自工作以来发生了什么变化?你不能回到工作版本吗?你没有源代码控制吗?如果没有,为什么没有?否则你如何在做出潜在的破坏性变化之前跟踪工作代码?@Marcus我正在Mac终端上用gcc编译。在我的系统上运行良好,除了输出20x47矩阵和很明显,除了依赖于
    中的
    c
    的随机初始值,而(c!=EOF)
    @phihag-Bah…我担心我会听到这个。我的csv文件是否有可能被破坏或以某种方式变形?!@Marcus Mac OSX是Unix,因此使用
    \n
    .1。这不是问题(如果存储了正确的边界)因为他正在正确地结束写入的字符串。另外,
    c
    不应该是
    char
    ;当然,它应该是
    int