R语言细节 与c相结合的时候的细节

1、使用write.table中的  row.names自己写成raw.names,检查很长时间检查不出来问题。。

2、write.table或者csv这种,写入的对象更多的是,对于矩阵或者data.frame类型的。所以自己用一个向量写入的时候,被看作data.frame分开了,所以此时sep使用sep=","等均不起作用。

3、对于向量,最终选择使用,writeLines.  但是同样要注意的是:这个writeLines用于string vector 不是number vector.

wirteLines(x, con=xx, sep="" )其中con为con = file("filename", "w")这种链接,但是还是需要最后 close(con)

上述使用文件名字也可以,不一定用connection。

4、对于真正的数值vector写入txt这种使用write()即可,为:write(number_vector, file=xx, sep=",", ncolumns = 自己设定行数)

5、R语言中,敲esc是退出正在运行的,敲quit()是退出rstdio

6、c语言中字符串数组是可以用,字符串这个地址值直接赋值的,就是说自己平时使用的{1,2,3}这种类型是一个地址值

char a[10] ="123";

 

7、c语言中的输出格式,只有字符串输出确实是有点奇葩,其他都是变量本身,而只有字符串输出是字符串的地址。因为对指针加上取值符号,取出来的是实际值,但是格式化输出就是用指针输出 实际值,而不是指针加上* 来取实际值。。。

 

因此造成,字符数组输出的时候,也是字符串地址,甚至于说取地址符号+数组名字也行因为:

数组名字是地址,但是数组名字又不完全是指针。所以对于字符数组这种格式的printf输出使用的是%s和数组名字,或者数组名字前面加取取内容符号都是可行的。因为数组名字特殊化。

int arr[5];
int arr[5] = { 1, 2, 3, 4, 5 };
printf("%d\n", *arr);
printf("%d\n", *(arr + 1));
printf("%d\n", *((int*)(&arr + 1)));
printf("%d\n", *((int*)(&arr + 1) - 1));
1
2
-858993460
5

 

前两个输出是很好理解的,对指针的加一操作会使指针按照指针的类型移动相应的位置。

第三行输出中,首先得到了指向整个数组的指针,对其进行加一操作,指针就指向了整个数组后面的地址,也就是5后面的地址,那么此时将其转化为int*类型再输出,就得到了该未初始化过的值。

第四行输出中,过程为,指针指向5后面的地址,转为int*类型,此时的减一操作使指针移动一个int类型大小的地址空间,那么便指向了5。

8、c语言中,读取文件有两种方式,一行一行的,和一个一个的。但是判断结束的方式是while( (c = fgetc())!= EOF )

8.1 )怎么使用fgetc完成一行一行读取的方法??(假如中间隔离符号是逗号?)

8.2)怎么使用fgets完成一行一行读取的方法??(假如中间隔离符号是逗号?)

8.1)while(fgets() != NULL)  注意两点,一个是fp会随着这个fgets而一起变动。并且fgets有两种种情况会返回null,一个是出错了,一个是到末尾。而到行尾,只会说停止,返回的是正常的指针值,并且给返回的指针值加上了结束符号,而下次开始自动跳到下一个位置开始。而不是由于一行停止而返回的null。

 

char* fgets( char* str, int num, FILE* file)这是指定num的长度读取,但是假如一次要读取一整行?c语言并没有函数fgetline()函数。所以只能按照超过一行的长度,让fgets自动停止了。因为遇到行尾会自动停止,

 

8.2) 使用fgetc这个,就不要考虑怎么使用fgetc读一行了,而是怎么使用fgets度一行,此处也就是fgetc遇到出错或者文件结尾的这个EOF一直没有在意过,EOF是文件结尾时候,自动有的一个标记符号,只是fgets识别到了会给出NULL返回,而fgetc由于就是读字符的,因此返回的就是EOF本身这个字符!!!!!所以判断fgets与fgetc这个结束关系不同的原因就在这里

 

while((c=fgetc(fp))!=EOF){}

 

 

9、再次总结,fgets fputs再怎么一行一行,其格式都是字符串,而字符串要往真实的数据值,或者剔除空格等,都要自己编代码剔除。

而fprintf  fscanf这两个是指定格式,中间基本不考虑间隔符号,

fread  fwrite是也是不考虑中间间隔符号,而是统一的按照数组的元素大小,统一写进去。所以除了处理字符串与字符这种,其他的格式都是一种类型统一起来处理的。。。没有额外间隔符号,只是需要确认,在后两类中,空格是否算上间隔符号????

size_t  fwrite(pstr*, size, count, FILE* stream)

size_t fread(pstr*, size, count, FILE* stream)

fprintf(FILE*, "%d" 就是:const char *format ,  平时用的参数列表);

fread和fwrite分别遇到换行符怎么办????fprintf和fscanf分别遇到换行符怎么办??

上述fread是对于换行符也会识别成一定字节长度的标记,就是一直往前读的。。

 

其实上述可以总结为:当格式不固定的时候,那么只能用fgets fputs这样分解成行,再在字符串中一点一点分解, 而如果格式固定的话,就可以从开始到结束一直走下去。。。

由于fread和fwrite都是不让人看的情况,所以,真实的使用fwrite写进去,打开文件,,看到的竟然是乱码,但是按照固定长度读出来,那么解码就是正确的。所以,fread和fwrite与fprintf的区别是,不让人看,就是按照字节走的

fprintf是让人按照格式看的,而fgets这类是让人按照字符串看的,不是指定格式看的

 

10、注意,其中, fscanf与scanf都是不能获取到空格的,所以自己设定的全部都是空格形式的,都是自动滤掉空格,因为没有空格默认的隔离,那么根本区分不开读入的一个一个数字呢。

11、对于其中的文件名字不同的自动处理,不要使用strcat,因为默认strcat是链接都是字符的内容,而文件名字是有固定的格式的,一旦有固定的格式,还是使用sprintf最好了,这样是sprintf(filename*, "%s%d%s", 各个实际的值)

例如字符上想显示1,那么就要给char i ='1'这种而不是直接char i = 1这种赋值!!!!!第二种直接赋值的是数值1,ascii码值1,而不是字符上的47这个ascii值对应的1.

 

11、而对于,字符串转换为整形值,那么使用的是,atoi, 反之是itoa,但是这个并不是标准库,所以。。。没有办法。。无用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值